c#:细说时区、DateTime和DateTimeOffset在国际化中的应用

先说下结论:

如果系统不考虑全球化的话,那么我们不用考虑时区的问题,因为我们可以认为中国境内的计算机全部用的是北京时间。

1. 时区的来源和划分

地球自转一圈是360度,共24小时,所以1小时15度,即:15度就是1个时区。

国际定义了本初子午线(0度经线)的位置在英国伦敦格林尼治天文台,自然世界时(UTC)也是指的格林尼治天文台(GMT)那里的时间。

认为北京处在东经120度线上,也就是东八区上,所以北京相比UTC时间有8个小时的时差。

由于地球自西向东转,所以北京比格林尼治最先接触阳光,自然就认为北京的时间比格林尼治快8个小时。

比如说:

2020-01-01 00:00:00 +00:00:表示格林尼治此时正值午夜凌晨。

但用北京时间表示为 2020-01-01 00:08:00 +08:00,即:北京此时天已经亮了,人们正在准备上班。

为什么会有北京时间,全世界都用一个UTC时间不就行嘛?

世界那么大,各地都有自己的习惯,如果突然统一起来,真的不习惯。

比如说,按照UTC时间,我们应该午夜凌晨正在上班的路上,这听起来就很疯狂。。。

2. 全国统一用北京时间吗?新疆的也用北京时间?

1949年建国后,国家就规定统一用北京时间了。

新疆地区仅少部分本地居民使用新疆时间,但一般默认是北京时间(不过发布新闻的时候,仍能看到“北京时间”、“新疆时间”的字样)。

为什么新疆要使用北京时,从时区上来看,它们相差有2个时区呢?

解释:

比如说奥运会八点开始,那么:

北京新闻就报道,八点开始

新疆报道,十点开始

四川报道,九点开始

各地都不同,这样不就乱了套吗?所以就有了北京时间这个统一标准。

统一时间后,生活作息会有什么差别?

上午:

北京:8:00–12:00

新疆:10:00–14:00

下午:

北京:1:30–17:30

新疆:15:30–19:30

另外:对于北京的人,感官上有:新疆天黑的晚、上班晚。但其实是一样的,只不过北京的人习惯了6:30就天亮,18:00就天黑而已。

3. 如果需要国际化,该如何使用时间

前提:http请求头中虽然有关于语言(中文简体、英文?)的信息,但是没有携带客户端时区的信息。

既然如此,我们就要在服务端统一一种时区,这样方便我们开发调试,因为是国人开发的应用,所以就用北京时间即可。

剩下的就是客户端了,因为服务端无法预料客户端的时区,所以为了方便统一开发,我们可以统一返回携带时区信息的北京时间,客户端接收后自行转换即可。

常用的携带时区的时间有下面两种格式:

2020-01-02T01:08:07Z

2020-01-02 09:08:07 +08:00

针对这两种格式的转换示例如下:

//北京时间(东八区): 2020-01-02 09:08:07.123

var baseTime = new DateTimeOffset(2020, 01, 02, 09, 08, 07, 123, TimeSpan.FromHours(8));

//常规输出: 不考虑时区

var str = baseTime.ToString("yyyy-MM-dd hh:mm:ss");//2020-01-02 09:08:07

str = baseTime.ToString("yyyy-MM-dd hh:mm:ss.fff");//2020-01-02 09:08:07.123

//考虑时区,形式1

str = baseTime.ToUniversalTime().ToString("yyyy-MM-ddThh:mm:ssZ");//2020-01-02T01:08:07Z

str = baseTime.ToUniversalTime().ToString("yyyy-MM-ddThh:mm:ss.fffZ");//2020-01-02T01:08:07.123Z

//考虑时区,形式2

str = baseTime.ToString("yyyy-MM-dd HH:mm:ss zzz");//2020-01-02 09:08:07 +08:00

str = baseTime.ToString("yyyy-MM-dd HH:mm:ss.fff zzz");//2020-01-02 09:08:07.123 +08:00

//如果当前计算机设置的时区是北京时间(东八区)则输出为true,否则输出false

var parse1 = DateTimeOffset.Parse("2020-01-02 09:08:07.123");

Console.WriteLine($"parse1==baseTime: {parse1 == baseTime}");

//输出true

var parse2 = DateTimeOffset.Parse("2020-01-02T01:08:07.123Z");

Console.WriteLine($"parse2==baseTime: {parse2 == baseTime}");

//输出true

var parse3 = DateTimeOffset.Parse("2020-01-02 09:08:07.123 +08:00");

Console.WriteLine($"parse3==baseTime: {parse3 == baseTime}");

4. 那么c#中的DataTime和DataTimeOffset有什么差别?

相同点:它们两个都存储了年、月、日、时、分、秒、毫秒信息。

区别点:

DateTimeOffset中还存储了时区信息;

而DateTime中未存储时区信息,它总是认为自己存储的时间的时区是当前计算机设置的时区;

5. 以sqlserver为例看数据库中如何存储时间

sqlserver中的关于时间的类型如下:

date:3字节,表示范围:0001-01-01 到 9999-12-31

datetime:8字节,表示范围:1753-01-01 00:00:00 到 9999-12-31 23:59:59

datetime2:6-8个字节,表示范围:0001-01-01 00:00:00 到 9999-12-31 23:59:59.9999999

smalldatetime:4个字节,表示范围:1900-01-01 00:00:00 到 2079-06-06 23:59:59

time:5个字节,表示范围:00:00:00.0000000 到 23:59:59.9999999

datetimeoffset:10个字节,表示范围:0001-01-01 00:00:00 到 23:59:59.9999999,可表示时区

通过上面列举,我们可以发现,除非我们使用datetimeoffset,否则我们是无法保存时区信息的。

其实,对于服务器来说,数据库中存不存储时区并不是那么重要,只要保证web服务器、数据库服务器设置的时区一致即可!!!

推荐sqlserver中使用:datetime2。

另外:一般我们常设计列的类型为datetime,而不是datetime2。

其实这有个隐患:当程序中使用DateTime的默认值,即:0000-01-01时,我们无法插入到数据库中,报错如下:

“从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值”

这个报错,在文章:《c# SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值》中有专门说明。

6. 浏览器端如何显示时间

在 上面【3. 如果需要国际化,该如何使用时间】中建议后端返回的时间携带时区信息,也就是下面两种格式:

2020-01-02T01:08:07Z

2020-01-02 09:08:07 +08:00

那么前端应该怎么显示呢?

幸运的是,js脚本可以直接解析上面两种类型的时间,看下面代码:

> new Date(Date.parse("2020-01-02 09:08:07 +08:00")).toDateString()

>> "Thu Jan 02 2020"

> new Date(Date.parse("2020-01-02 09:08:07 +08:00")).toTimeString()

>> "09:08:07 GMT+0800 (中国标准时间)"

> new Date(Date.parse("2020-01-02T01:08:07Z")).toLocaleDateString()

>> "2020/1/2"

> new Date(Date.parse("2020-01-02T01:08:07Z")).toLocaleTimeString()

>> "上午9:08:07"

7. 关于夏令时

参考:《百度百科:夏令时》

夏令时是个奇怪且别扭的东西,中国曾经实行过6年(1986年到1991年),之后便废除了。

那么什么是夏令时的呢?

因为夏季天亮的早、黑的晚,而人们还是以冬季的时间点作息,导致起的晚浪费了阳光,睡的晚浪费了蜡烛,所以就人为的在夏季到来时的某天夜里2点偷偷的将时间调快1小时,然后在夏季结束时的某天夜里2点偷偷的将时间调慢1小时。

上面的一听就很别扭,还有人为改时间的!!!调整作息时间不就行了吗!

事实上,我们也仅在1986-1991年执行了6年而已,之后便废除了,现在我们都是夏季和冬季到来时调整作息时间的。

假如,我们使用夏令时会有什么影响呢?

夏季到来时,比如:1986年5月4日,在夜里凌晨2点你的表突然跳到了3点,这样你就少睡了一小时。。。

冬季到来时,比如:1986年9月14日,在夜里凌晨2点你的表突然跳到1点,这样你就多睡了一小时。。。

如果你恰好在这个时间段设置了定时任务,那么,你会发现,你的定时任务可能触发了两次,也可能没触发。。。

虽然我国废除了夏令时,但不代表其他国家也废除了,比如说美国目前就实行夏令时。

但,夏令时在全球已经明显不受欢迎了,

俄罗斯:实行了很长时间,最终2014年通过杜马法案废除了。

西班牙:还在偷偷改时间。

美国:不仅偷偷改时间,而且各个州的时区不一样,所以重要会议一般都会标注时区。

全球有110多个国家在使用夏令时。

欧盟正在废除夏令时的路上。

另外,想查看哪些地区支持夏令时,可以在电脑的时区设置中发现:

原文链接:https://blog.csdn.net/u010476739/article/details/118339679

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超赞的“数据与算法之美”资料分享!

相信,一直关注着我们的同学们都知道,小思妹分享了好多好多的资料给大家。为了方便新来的同学自取,小思妹又重新整理了一遍,直接点以下标题即可跳转!这是我见过的最全的训练数据集,没有之一!送你…

在ASP.NET Core微服务架构下使用数据库切分和扩展, 并用JMeter进行负载测试

原文链接:https://itnext.io/how-to-scale-an-asp-net-core-microservice-and-sharded-database-load-test-with-jmeter-1a8c7292e7e3现在,您将扩展应用程序并运行多个微服务和数据库的容器实例。您将使用Docker Compose和HAProxy负载均衡器:…

每日一笑 | 周杰伦到底什么时候才发新专辑?

全世界只有3.14 % 的人关注了数据与算法之美(图源网络,侵权删)

GARFIELD@10-18-2004

子非猫转载于:https://www.cnblogs.com/rexhost/archive/2004/10/18/53799.html

【荐】牛逼的WPF动画库:XamlFlair

【荐】牛逼的WPF动画库:XamlFlair原文链接:https://github.com/XamlFlair/XamlFlair翻译:沙漠尽头的狼(本文未全文翻译,建议阅读原文了解更多)XamlFlairXamlFlair库的目标是简化常见动画的实现,并允许开发人员使用几行…

java字符串如何输出_java字符串如何输出

在Java编程中,我们常常用 System.out.println(); 来输出字符串。System.out.println();System是一个类,继承自根类Objectout是类PrintStream类实例化的一个对象,且是System类的静态成员变量println()是类PrintStream的成员方法,被…

简单易懂的自动驾驶科普知识

全世界只有3.14 % 的人关注了数据与算法之美有不少人问我人工智能和自动驾驶的技术问题,我作为一个主业是后端开发的老码农可是回答不了啊!今天转载一篇自动驾驶大拿写的文章,学习一下。先来一张各大车企自动驾驶技术的分级图,大致…

WPF TextBox限制只能输入数字的两种方法

文本框中只能输入数字&#xff0c;一个常见的功能喽&#xff0c;今天就来看看如何实现它~下面就看看代码思路都写在xaml里面了&#xff0c;MainWindow.xaml:<Window x:Class"wpfcore.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/present…

国家特级数学教授李毓佩:我们欠孩子真正的数学阅读 !

▲数据汪特别推荐点击上图进入玩酷屋说到数学&#xff0c;我想起了13年一场轰动行业各界的“数学无用论”&#xff01;那时微博上有个话题叫做#让数学滚出高考#&#xff0c;超过7成网友都表示支持&#xff0c;这可怕的比例就能说明在中国由于数学差导致命运被洗牌的真不在少数……

程序员都想,却不敢做的事?我来!

一个 “实用” 的好命令&#xff0c;我不得试试&#xff1f;大家好&#xff0c;我是鱼皮。在编程届&#xff0c;有一个家喻户晓的实用 Linux 命令&#xff1a;rm -rf / 。据说&#xff0c;此命令一旦执行成功&#xff0c;就会给人带来快乐&#xff0c;是一个善良的好命令&#…

也来谈谈这致命的手机充电器

这两天有很多关于因使用iPhone在充电时打电话被电死的讨论&#xff0c;因此这里也来谈谈几点。 手机充电器的工作原理 刚好前段时间拆了两个充电器&#xff0c;看下里面的电路就明白了。鉴于网络上不明真相出来误导人的特别多&#xff0c;很多网站竟然还有文章说手机充电器里没…

每日一笑 | 一些关于学编程的领悟

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图源网络&#xff0c;侵权删&#xff09;

java基础变量_Java基础语法之变量和常量

上行没有"{"时&#xff0c;下行代码与上行首字母对齐标识符概述在Java中对变量、常量、函数和语句块都是有名字的&#xff0c;他们的名字统称为Java标识符。是为类、对象、方法、变量、接口和自定义数据类型命名的。组成标识符是由数字、字母、下划线(_)和美元符($)或…

GARFIELD@01-07-2005

completist 转载于:https://www.cnblogs.com/rexhost/archive/2005/01/07/88107.html

非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)

1、HDFS简介 HDFS&#xff08;Hadoop Distributed File System&#xff09;是Hadoop项目的核心子项目&#xff0c;是分布式计算中数据存储管理的基础&#xff0c;是基于流数据模式访问和处理超大文件的需求而开发的&#xff0c;可以运行于廉价的商用服务器上。它所具有的高容错…

.net core 浅克隆和深克隆/浅拷贝和深拷贝

除非语言里只有基础类型&#xff0c;没有引用类型&#xff0c;否则用任何一种编程语言克隆对象都是很棘手的事情。1、前言"老沉&#xff0c;什么是深克隆&#xff0c;什么是浅克隆?"“哈&#xff0c;迷茫了&#xff1f;这深深浅浅的体验是不是把你搞晕了&#xff1f…

中国三代核电最新进展;AI助力发现系外行星;腾讯发现特斯拉系统漏洞;论文剽窃被撤销学位;金立破产债权达173亿;这就是今日大新闻...

今天是4月3日农历二月廿八今天星期三最近上班老是有人来推销办理信用卡是谁把我缺钱花的消息透露出去了下面是今天的大新闻中国发布三代核电最新进展&#xff08;环球时报&#xff09;由中国核能行业协会主办的中国核能可持续发展论坛1日在京举行&#xff0c;多位专家现场发布了…

java对象模型是什么_蓝石榴_个人博客_JVM内存结构、Java内存模型、Java对象模型...

JVM内存结构我们都知道&#xff0c;Java代码是要运行在虚拟机上的&#xff0c;而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域&#xff0c;这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在&#xff0c;而有些区域则依赖用户线程的…

使用微信云托管快速部署一个.Net Core项目(一)

前几天微信将小程序开发者工具内的云托管升级为微信云托管&#xff0c;新增了很多诸如OpenApi、MySql数据库、流水线构建、web控制台等能力。看文档还是蛮激动的&#xff0c;对开发者来说确实是个好消息&#xff0c;因为之前的一些业务逻辑大都写在云函数或者部署在服务器里面&…

中国禁止洋垃圾后,韩国这座垃圾山已经烧了3个月,全部烧完还要5年!

全世界只有3.14 % 的人关注了数据与算法之美2017年5月&#xff0c;韩国洛东江畔的樱花&#xff08;图片来源&#xff1a;东方IC&#xff09;去年平昌冬奥会&#xff0c;由5名来自义城郡的姑娘组成的韩国冰壶队战胜各路强手&#xff0c;夺得亚军&#xff0c;这让义城郡这座风景秀…