【发布时间】:2018-06-21 00:22:29
【问题描述】:
我知道 Unix 时间戳本质上是 UTC(误导,这不是真的,new Date() 将始终位于浏览器/服务器时区,.getTime() 反映了这一点)。
转换为 C# DateTime 时怎么不是 UTC。
我已将 2092 年 8 月 9 日的日期转换为以秒为单位的时间戳 (3869074800),
new Date('August, 9 2092').getTime()/1000
或https://codepen.io/pnmcosta/pen/rpvjVp
但是当转换为 C# 日期时,它不是 UTC(2092 年 8 月 8 日晚上 11:00:00)?即使 EPOCH 已创建为 UTC:
using System;
public class Program
{
public readonly static DateTime EPOCH_UNIX = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private readonly static double MaxUnixSeconds = (DateTime.MaxValue.ToUniversalTime() - EPOCH_UNIX).TotalSeconds;
public static void Main()
{
Console.WriteLine(FromUnixTimeStamp(3869074800));
}
public static DateTime FromUnixTimeStamp(long value)
{
return value > MaxUnixSeconds ? EPOCH_UNIX.AddMilliseconds(value) : EPOCH_UNIX.AddSeconds(value);
}
}
或https://dotnetfiddle.net/ERySea
如何最好地处理这种情况,记住时间并不重要,但日期应该是正确的?
编辑 2
我想我可能已经破解了日期以找出偏移量(更新 https://dotnetfiddle.net/ERySea)到:
using System;
public class Program
{
public readonly static DateTime EPOCH_UNIX = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private readonly static long MaxUnixSeconds = (long)(DateTime.MaxValue.ToUniversalTime() - EPOCH_UNIX).TotalSeconds;
public static void Main()
{
// date with DST (Daylight savings time), e.g. 08/09/2092 (DD/MM/yyyy)
// is stored as, e.g. 3869074800 seconds, from EPOCH_UNIX
// instead of 3869078400 (UTC, without offsets) as it should be!
DateTime dt = FromUnixTimeStamp(3869074800);
Console.WriteLine("Date: {0:dd MMM yyyy HH:mm}", dt);
// fix DST offset
if (dt.Hour != 0)
{
int offset = 24 - dt.Hour;
dt = dt.AddHours(offset);
Console.WriteLine("Offset: {0}", offset);
}
// fix century (if date of birth)
if (dt.Year >= DateTime.UtcNow.Year)
dt = dt.AddYears(-100);
Console.WriteLine("Fixed Date: {0:dd MMM yyyy HH:mm}", dt);
}
public static DateTime FromUnixTimeStamp(long value)
{
return value > MaxUnixSeconds ? EPOCH_UNIX.AddMilliseconds(value) : EPOCH_UNIX.AddSeconds(value);
}
}
【问题讨论】:
-
根据unixtimestamp.com/index.php August 9, 2092 00:00:00 是 3869078400 ,而不是 ... 4800 和 3869074800 确实是 8/8/2092 11:00:00 PM UTC
-
使用双精度表示秒数看起来很可疑。我建议使用 long,尤其是对于这么大的值。
-
@Fildor,如果 getTime() 旨在返回 UTC 时间戳,那么 new Date('August, 9 2092').getTime()/1000 怎么会不正确?
-
我不知道。关键是:您的代码可能是正确的。它只是输入了错误的值。
标签: c# datetime unix epoch date-conversion