C#中的时间戳
什么是时间戳
时间戳默认是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及更高版本里才能使用。
long timestamp = datetimeoffset.now.tounixtimeseconds(); // 相差秒数 console.writeline(timestamp);
通用的老方法
system.datetime starttime = timezone.currenttimezone.tolocaltime(new system.datetime(1970, 1, 1)); // 当地时区 long timestamp = (long)(datetime.now - starttime).totalseconds; // 相差秒数 system.console.writeline(timestamp);
unix时间戳转换为c# datetime
.net 4.6新方法
由时间戳转换的datetimeoffset
的时区默认是+00:00
,此时我们需要转为本地时区,否则后续使用可能会有问题。
转为本地时区:datetimeoffset.localdatetime
。
示例代码如下:
//默认为utc时间:{2019/11/14 1:53:26 +00:00} datetimeoffset dto = datetimeoffset.fromunixtimemilliseconds(1573696406184); //默认为utc时间:{2019/11/14 1:53:26} datetime dt01 = dto.datetime; //转为本地时区:{2019/11/14 9:53:26} datetime dt02 = dto.localdatetime;
通用的老方法
long unixtimestamp = 1478162177; system.datetime starttime = timezone.currenttimezone.tolocaltime(new system.datetime(1970, 1, 1)); // 当地时区 datetime dt = starttime.addseconds(unixtimestamp); system.console.writeline(dt.tostring("yyyy/mm/dd hh:mm:ss:ffff"));
备注
datetimeoffset使用now还是utcnow
对于datetimeoffset
,发现有2个获取当前时间的属性:datetimeoffset.now
和datetimeoffset.utcnow
。
如果只是获取时间戳,这2个使用哪个都可以,得到的值是一样的。
因为datetimeoffset
里面有时区信息,获取时间戳时会使用时区进行转换的,所以获得的时间戳一样。
而也是因为时区的原因,datetimeoffset
的其他操作可能会不一样。例如datetimeoffset.datetime
就不一样,此时推荐使用datetimeoffset.localdatetime
来获得本地时区的时间。
测试代码如下:
//none:2019/6/14 15:17:43 +08:00 console.writeline("none:{0}", datetimeoffset.now); //utc:2019/6/14 7:17:43 +00:00 console.writeline("utc:{0}", datetimeoffset.utcnow); //none:1560496663 console.writeline("none:{0}", datetimeoffset.now.tounixtimeseconds()); //utc:1560496663 console.writeline("utc:{0}", datetimeoffset.utcnow.tounixtimeseconds());
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
-
指定时区:指定时区后
指定时区有2种方式:datetime.kind
就是相对应的值。- 【默认+优先】待转换的字符串里有时区信息。例如:
2019/11/24 17:40:32 +08:00
- 使用
datetimestyles
参数来指定时区。datetimestyles
是枚举类型,更多信息自己查看定义,这里不再多说。
- 【默认+优先】待转换的字符串里有时区信息。例如:
- 【默认】在未指定时区时,
local
和utc
都会把相应的时区传递过去。对于 unspecified
(未指定),会被当做本地时区来处理(结果已验证,源码没看懂)。
测试代码
//dtnow:2019/11/24 17:40:32(kind:local) datetime dtnow = datetime.now; //dtutcnow:2019/11/24 9:40:32(kind:utc) datetime dtutcnow = datetime.utcnow; //dtparse:2019/11/24 17:40:13(kind:unspecified) datetime dtparse = datetime.parse("2019-11-24 17:40:13"); //dtonow:2019/11/24 17:40:32 +08:00 datetimeoffset dtonow = dtnow; //dtoutcnow:2019/11/24 9:40:32 +00:00 datetimeoffset dtoutcnow = dtutcnow; //dtoparse:2019/11/24 17:40:13 +08:00 datetimeoffset dtoparse = dtparse; console.writeline("datetime:"); console.writeline("dtnow:{0}(kind:{1})", dtnow, dtnow.kind); console.writeline("dtutcnow:{0}(kind:{1})", dtutcnow, dtutcnow.kind); console.writeline("dtparse:{0}(kind:{1})", dtparse, dtparse.kind); console.writeline(); console.writeline("datetimeoffset:"); console.writeline("dtonow:{0}", dtonow); console.writeline("dtoutcnow:{0}", dtoutcnow); console.writeline("dtoparse:{0}", dtoparse);
输出结果如下:
datetime: dtnow:2019/11/24 17:40:32(kind:local) dtutcnow:2019/11/24 9:40:32(kind:utc) dtparse:2019/11/24 17:40:13(kind:unspecified) datetimeoffset: dtonow:2019/11/24 17:40:32 +08:00 dtoutcnow:2019/11/24 9:40:32 +00:00 dtoparse:2019/11/24 17:40:13 +08:00
datetimeoffset.parse的默认时区
datetimeoffset.parse
的默认时区是当前时区。
//parse:2019/6/14 15:38:49 +08:00 console.writeline("parse:{0}", datetimeoffset.parse("2019-6-14 15:38:49"));
参考
- c# datetime与时间戳转换:
- 如何将unix时间戳转换为datetime,反之亦然?:
- datetimeoffset源码:https://source.dot.net/#system.private.corelib/shared/system/datetimeoffset.cs
推荐阅读
-
在JS中操作时间之getUTCMilliseconds()方法的使用
-
在JavaScript中操作时间之getUTCDate()方法的使用
-
在JavaScript中处理时间之setMinutes()方法的使用
-
C#中让控件全屏显示的实现代码(WinForm)
-
C#中38个常用运算符的优先级的划分和理解
-
JS中处理时间之setUTCMinutes()方法的使用
-
C# 得到某一天的起始和截止时间的代码
-
在JavaScript中操作时间之getYear()方法的使用教程
-
C#中TextBox实现输入提示功能的方法
-
C#中datagridview的EditingControlShowing事件用法实例