C#-将日期转换为unix时间戳

时间:2018-11-21 23:39:39

标签: c# datetime unix-timestamp

我正在尝试将日期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时间戳。查看本地时间选项,然后查看时间戳(以毫秒为单位)

3 个答案:

答案 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日以来经过的秒数。这就是为什么在该日期之前获得负数的原因。