我正在尝试将日期Saturday, 22. October 1932 00:00:00
转换为unix时间戳-1173747600000
。
我的代码在这里:
DateTimeOffset dt2 = new DateTimeOffset(new DateTime(1932, 10, 22)).ToUniversalTime();
long a = dt2.ToUnixTimeMilliseconds();
我正在获取时间戳-1173751200000
。我在做什么错了?
Epochconverter.com正在按预期方式计算UNIX时间戳。查看本地时间选项,然后查看时间戳(以毫秒为单位)
答案 0 :(得分:1)
第一个线索是时间戳之间的差异:它们相差3600秒,换句话说就是一小时。我的猜测是有一个夏令时问题要解决。
通过查看对象的属性,可以看到DateTimeOffset正在应用此方法。在Powershell中使用它:
$t = [datetime]::Parse("1932-10-22")
new-object system.datetimeoffset($t)
给出输出:
DateTime : 22/10/1932 00:00:00
UtcDateTime : 21/10/1932 23:00:00
LocalDateTime : 22/10/1932 00:00:00
Date : 22/10/1932 00:00:00
Day : 22
DayOfWeek : Saturday
DayOfYear : 296
Hour : 0
Millisecond : 0
Minute : 0
Month : 10
Offset : 01:00:00
Second : 0
Ticks : 609618528000000000
UtcTicks : 609618492000000000
TimeOfDay : 00:00:00
Year : 1932
DateTimeOffset.ToUniversalTimeMilliseconds()
从日期时间的UTC值返回unix时间。
因此,您需要改为使用UTC时区创建DateTimeOffset,因此(再次使用PS,但转换为C#并不容易)
$t = [datetime]::Parse("1932-10-22")^C
$ofs = new-object System.Timespan(0)
new-object system.datetimeoffset($t, $ofs)
礼物:
DateTime : 22/10/1932 00:00:00
UtcDateTime : 22/10/1932 00:00:00
LocalDateTime : 22/10/1932 01:00:00
Date : 22/10/1932 00:00:00
Day : 22
DayOfWeek : Saturday
DayOfYear : 296
Hour : 0
Millisecond : 0
Minute : 0
Month : 10
Offset : 00:00:00
Second : 0
Ticks : 609618528000000000
UtcTicks : 609618528000000000
TimeOfDay : 00:00:00
Year : 1932
现在,这给出了一个毫秒纪元时间戳-1173744000000,这与您期望的值不同。我检查了一些资料,包括epochconvertor.com,这似乎是正确的时间。您提供的时间戳为-1173747600000,是1932年10月21日在23:00:00。
答案 1 :(得分:1)
您忘记了时区。 22 October 1932 00:00
等于-1173747600000
的唯一时区是UTC-01:00
.NET(我能找到)在本地或UTC以外的时区中没有任何方法可以创建DateTime
,因此您只需要从UTC中减去一个小时,带您到21 October 1932 23:00 UTC
:
var date = new DateTime(1932, 10, 21, 23, 0, 0, DateTimeKind.Utc);
var dt2 = new DateTimeOffset(date).ToUniversalTime();
long a = dt2.ToUnixTimeMilliseconds();
结果为-1173747600000
。
答案 2 :(得分:0)
UNIX时间戳是自1970年1月1日以来经过的秒数。这就是为什么在该日期之前获得负数的原因。