我正在尝试获取Unix时间下的GMT时间。我使用以下代码:
public static long GetGMTInMS()
{
// 获取当前时间的协调世界时(UTC)并将其转换为时间戳
var unixTime = DateTime.Now.ToUniversalTime() -
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return (long)unixTime.TotalMilliseconds; // 返回毫秒级时间戳
}
要将Unix时间转换回DateTime对象,我使用以下代码:
// 将 Unix 时间戳转换为日期时间
public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
{
// 创建一个以 1970 年 1 月 1 日 0 时 0 分 0 秒为基准的 DateTime 对象
System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
// 添加 Unix 时间戳所表示的毫秒数并将其转换为本地时间
dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp).ToLocalTime();
// 返回转换后的日期时间对象
return dtDateTime;
}
运行代码时,GetGMTInMS()
返回1320249196267
。当我把它传递给 UnixTimeStampToDateTime()
,我得到的结果是{11/2/2011 11:53:16 AM}
。
这很好。那是我运行代码时的正确时间。问题在于,当我尝试将1320249196267
放入 Unix 时间转换器(例如此处),它返回了完全错误的时间。
另一个问题是,我在东部时区。这返回了我的时区的时间。这是 DateTime 对象处理的还是我没有获取到 GMT?
ulong
而不是long
,因为 UNIX 时间戳不能为负。 - Erik Schierboomlong.MaxValue
秒还有很长时间才到,我认为更灵活地接受1970年以前的负时间值更合理。 - Jon Skeet