【问题标题】:Unix timestamp function not returning expected timestamp, wrong timezone?Unix时间戳函数没有返回预期的时间戳,错误的时区?
【发布时间】:2017-10-06 20:14:29
【问题描述】:

我正在使用自定义函数来获取当前日期并减去天数,然后返回 unix 格式的时间戳。除了预期的输出不正确外,所有转换都工作正常。我想通过设置

DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, 0, 0, 0)

0,0,0,它会在当天午夜给我,但给我的是凌晨 5 点(格林威治标准时间)。

我的自定义函数:

public static int getUnixTimestamp(int days) {
    // Date to convert
    DateTime dateTime = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, 0, 0, 0).AddDays(-days);

    return (int)(TimeZoneInfo.ConvertTimeToUtc(dateTime) -
           new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds;
}

任何关于可能导致此问题的想法或反馈都会很棒,谢谢!

【问题讨论】:

  • 自纪元以来的 Unix 时间戳不是 ,而不是天吗?
  • @silkfire 没关系,我不认为,我正在将 DateTime 转换为 unix 时间戳。
  • 对不起,错过了那部分。您是否尝试过 .NET v4.6 中可用的 DateTimeOffset.ToUnixTimeSeconds 方法?
  • @silkfire 遗憾的是,我的项目在 .net 2 上,我没有更新到 4+ 的选项。不过,那真是太好了。
  • 什么样的公司使用这么老的框架;)

标签: c# asp.net datetime unix


【解决方案1】:

您正在调用DateTime 构造函数 没有指定Kind,那么您正在调用ConvertTimeToUtc。这将 假设 dateTime 实际上是本地的,并将其转换为 UTC。鉴于您已经使用 UTC 值构建它,您不需要转换它。

您有一个单独的问题,即多次调用DateTime.UtcNow - 这些调用之间的日期可能会发生变化。最好使用DateTime.UtcNow.Date 来获取“今天的UTC 日期”。

这里有更好的代码:

private static readonly DateTime UnixEpoch =
    new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);

// TODO: Give this a clearer name
public static int GetUnixTimestamp(int days)
    => (int) ((DateTime.UtcNow.Date.AddDays(-days) - UnixEpoch).TotalSeconds);

重要的是,DateTime.UtcNow.Date.AddDays(-days)Kind 仍将是 DateTimeKind.Utc

【讨论】:

  • 感谢清晰的解释!可用时将接受。
猜你喜欢
  • 1970-01-01
  • 2017-04-25
  • 2015-10-23
  • 1970-01-01
  • 2014-02-12
  • 2011-10-01
  • 2012-05-06
  • 2011-09-26
  • 2023-04-08
相关资源
最近更新 更多