【问题标题】:C# Convert from and back to Unix timestampC# 从和返回到 Unix 时间戳
【发布时间】:2021-12-23 11:42:33
【问题描述】:

我有以下失败的单元测试

[Fact]
public void Convert_to_and_from_unix_timestamp()
{
    // Arrange
    var timestamp = 1636579063;
    var date = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;

    // Act
    var unixTimeSeconds = ((DateTimeOffset)date).ToUnixTimeSeconds();

    // Assert
    Assert.Equal(expected: timestamp, actual: unixTimeSeconds);

    // result
    // Expected: 1636579063 // 10/11/2021 21:17:43
    // Actual: 1636575463 // 10/11/2021 20:17:43
}

新的(实际的)Unix 时间戳是负一小时。我的机器时区是 UTC+1。这是否意味着 DateTimeOffset 会自动将我的时区 (UTC+1) 设置为日期时间,并且在转换回时间戳时 DateTimeOffset 正在删除 UTC+1,因此会减少一小时?如何以两种方式管理时区?

【问题讨论】:

标签: c# timezone


【解决方案1】:

问题出在.DateTime片段中

    var date = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;

根据reference source

private DateTime ClockDateTime {
  get {
    // Here we lose Timezone (Offset) - it just added to m_dateTime
    // Kind is Unspecified, that's why we can restore the fact
    // Offset == 0 and we actually have UTC datetime    
    return new DateTime((m_dateTime + Offset).Ticks, DateTimeKind.Unspecified);
  }
}
 
public DateTime DateTime {
  get {
    return ClockDateTime;
  }
}

.Net 为.DateTime 属性创建了一个新的DateTime 实例和Kind == DateTimeKind.Unspecified,所以你失去了时区(现在DateTimeOffset 中的Offset 只是添加DateTime) .

为了更正测试把.UtcDateTime而不是.DateTime:

    var date = DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime; 

【讨论】:

  • 谢谢德米特里,它工作得很好,解释得很好!我不知道 MS 参考源,很酷 :-)
猜你喜欢
  • 2011-12-10
  • 2018-01-04
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多