来源:https://blog.guoqianfan.com/2019/11/24/timestamp-in-csharp/
什么是时间戳
时间戳默认是Unix时间戳。
首先要清楚JavaScript与Unix的时间戳的区别:
JavaScript时间戳:是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。
Unix时间戳:是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
可以看出JavaScript时间戳是总毫秒数,Unix时间戳是总秒数。
比如同样是的 2016/11/03 12:30:00 ,转换为JavaScript时间戳为 1478147400000;转换为Unix时间戳为 1478147400。
从上面也可以看出时间戳与时区无关。
Unix时间戳相互转换
C# DateTime转换为Unix时间戳
.NET 4.6新方法
只能在 .NET 4.6及更高版本里才能使用。
1 | long timeStamp = DateTimeOffset.Now.ToUnixTimeSeconds(); |
通用的老方法
1 | System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); |
Unix时间戳转换为C# DateTime
.NET 4.6新方法
由时间戳转换的DateTimeOffset
的时区默认是+00:00
,此时我们需要转为本地时区,否则后续使用可能会有问题。
转为本地时区:DateTimeOffset.LocalDateTime
。
示例代码如下:
1 |
|
通用的老方法
1 | long unixTimeStamp = 1478162177; |
备注
DateTimeOffset使用Now还是UtcNow
对于DateTimeOffset
,发现有2个获取当前时间的属性:DateTimeOffset.Now
和DateTimeOffset.UtcNow
。
如果只是获取时间戳,这2个使用哪个都可以,得到的值是一样的。
因为DateTimeOffset
里面有时区信息,获取时间戳时会使用时区进行转换的,所以获得的时间戳一样。
而也是因为时区的原因,DateTimeOffset
的其他操作可能会不一样。例如DateTimeOffset.DateTime
就不一样,此时推荐使用DateTimeOffset.LocalDateTime
来获得本地时区的时间。
测试代码如下:
1 |
|
DateTime转换为DateTimeOffset
可以直接把DateTime
赋值给DateTimeOffset
,内部会自动进行隐式转换。这里涉及到时区,请往下看。
DateTime的时区信息(Kind属性)
DateTime
的时区信息存放在Kind
属性里。Kind
属性的数据类型是DateTimeKind
枚举,只有3个值:
Unspecified
:未指定/未规定Utc
:UTC
时间Local
:本地时区
不同情况下得到的DateTime
的Kind
是不同的,具体如下:
DateTime.Now
:DateTime.Kind
是 **Local
(本地时区)**。DateTime.UtcNow
:DateTime.Kind
是 **Utc
**。DateTime.Parse()
:【默认】在未指定时区时,
DateTime.Kind
是Unspecified
指定时区:指定时区后
DateTime.Kind
就是相对应的值。指定时区有2种方式:
- 【默认+优先】待转换的字符串里有时区信息。例如:
2019/11/24 17:40:32 +08:00
- 使用
DateTimeStyles
参数来指定时区。DateTimeStyles
是枚举类型,更多信息自己查看定义,这里不再多说。
- 【默认+优先】待转换的字符串里有时区信息。例如:
Local
和Utc
都会把相应的时区传递过去。对于 Unspecified
(未指定),会被当做本地时区来处理(结果已验证,源码没看懂)。
测试代码
1 |
|
输出结果如下:
1 | DateTime: |
DateTimeOffset.Parse的默认时区
DateTimeOffset.Parse
的默认时区是当前时区。
1 |
|
参考
- C# DateTime与时间戳转换:https://www.cnblogs.com/polk6/p/6024892.html
- 如何将Unix时间戳转换为DateTime,反之亦然?:https://stackoverflow.com/questions/249760/how-can-i-convert-a-unix-timestamp-to-datetime-and-vice-versa
- DateTimeOffset源码:https://source.dot.net/#System.Private.CoreLib/DateTimeOffset.cs