当前位置: 移动技术网 > IT编程>开发语言>c# > C#中的时间戳

C#中的时间戳

2019年11月25日  | 移动技术网IT编程  | 我要评论
本文介绍了C#中时间和时间戳的转换方法,以及DateTimeOffset的简单使用。 ...

什么是时间戳

时间戳默认是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.nowdatetimeoffset.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:未指定/未规定
  • utcutc时间
  • local:本地时区

不同情况下得到的datetimekind是不同的,具体如下:

  • datetime.nowdatetime.kindlocal(本地时区)
  • datetime.utcnowdatetime.kindutc
  • datetime.parse()

    • 默认】在未指定时区时,datetime.kindunspecified
    • 指定时区:指定时区后datetime.kind就是相对应的值。

      指定时区有2种方式:
      • 默认+优先待转换的字符串里有时区信息。例如:2019/11/24 17:40:32 +08:00
      • 使用datetimestyles参数来指定时区。datetimestyles是枚举类型,更多信息自己查看定义,这里不再多说。

localutc都会把相应的时区传递过去。对于 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"));

参考

  1. c# datetime与时间戳转换:
  2. 如何将unix时间戳转换为datetime,反之亦然?:
  3. datetimeoffset源码:https://source.dot.net/#system.private.corelib/shared/system/datetimeoffset.cs

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网