Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unix时间戳函数未返回预期的时间戳,时区错误?_C#_Asp.net_Datetime_Unix - Fatal编程技术网

C# Unix时间戳函数未返回预期的时间戳,时区错误?

C# Unix时间戳函数未返回预期的时间戳,时区错误?,c#,asp.net,datetime,unix,C#,Asp.net,Datetime,Unix,我使用一个自定义函数获取当前日期并减去天数,然后以unix格式返回时间戳。除预期输出不正确外,所有转换都正常工作。我想通过设置 DateTimeDateTime.UtcNow.Year,DateTime.UtcNow.Month,DateTime.UtcNow.Day,0,0,0 到0,0,0,它会给我那一天的午夜,但它给了我格林威治标准时间早上5点 我的自定义功能: public static int getUnixTimestamp(int days) { // Date to co

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

DateTimeDateTime.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;
}
任何关于导致这种情况的想法或反馈都将非常好,谢谢

调用DateTime构造函数时没有指定种类,然后调用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的类型仍然是DateTimeKind.Utc。

Unix时间戳不是从纪元算起的秒,不是天吗?@silkfire这不重要,我不认为,我正在将DateTime转换为Unix时间戳。抱歉,错过了这一部分。您是否尝试过.NET v4.6中提供的DateTimeOffset.ToUnixTimeSeconds方法?@silkfire很遗憾,我的项目位于.NET 2上,我没有更新到4+的选项。不过,拥有这样的架构真是太好了。什么样的公司使用这样一个旧框架;谢谢你的解释!将在可用时接受。