如何将Unix时间戳转换为日期时间

8

我正在尝试将这个Unix时间戳1415115303410转换为DateTime,方法如下:

private static DateTime UnixTimeStampToDateTime(long unixTimeStamp)
{
        System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
        dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp);
        return dtDateTime;
}

但是我得到了一个错误的日期: 日期:{04/11/0045 00:00:00}

注意:dtDateTime.AddSeconds(unixTimeStamp) 抛出异常...我的数字是以毫秒为单位。

使用这个在线转换工具http://www.epochconverter.com/,我得到了正确的转换:

04/11/2014 15:35:03 GMT+0:00

我该如何转换这个日期?


可能是https://dev59.com/cnVC5IYBdhLWcg3wliGe的重复问题,该问题涉及如何将Unix时间戳转换为日期时间以及反之。 - João Miguel Brandão
2
那我觉得你需要用AddSeconds函数,对吧? - João Miguel Brandão
@JoãoMiguelBrandão AddSeconds 抛出异常,1415115303410 是毫秒。 - DevT
你确定要调用这个方法吗? - Ofiris
那么,如果您要转换的数字不是Unix时间戳,则问题就错了。将其除以1000,然后它将成为一个Unix时间戳,您可以进行转换。 - louigi600
显示剩余3条评论
8个回答

10

您的代码已经很好了,不需要修改。这里提供一个演示

所有建议使用AddSeconds的人都是错误的。您提供的数字显然是以毫秒为单位的。一年有31,536,000秒。1415115303410除以31536000等于4487。自1970年1月1日以来还没有过4487年。


这个日期是正确的,但时间是错误的。这个日期:1503583200123 是2017年8月25日上午9点,但你的代码给出的是2017年8月25日下午2点。 - DevShadow
1
@DevShadow 这可能是一个时区问题。在我的fiddle中,我使用的是UTC时间。下午2点可能是你所在时区的正确时间。 - Icemanind
教训:如果你在毫秒或秒钟级别上操作,请小心,可以参考这里 - Timo
Unix时间戳是自1970年1月1日00:00 UTC以来的秒数,因此您可能需要校正到您的时区。 - louigi600

9

只需使用DateTimeOffset

DateTimeOffset date = DateTimeOffset.FromUnixTimeSeconds(1415115303410)


8

使用AddSeconds而不是AddMilliseconds

 private static DateTime UnixTimeStampToDateTime(long unixTimeStamp) 
 {
    System.DateTime dtDateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
    dtDateTime = dtDateTime.AddSeconds(unixTimeStamp);
    return dtDateTime;
 }

就像我之前说过的,AddSeconds 会抛出异常,我的数字是以毫秒为单位。 - DevT
把它除以1000并转换成秒钟难道很困难吗? - louigi600

3
public DateTime FromUnixTime(long unixTime)
{
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return epoch.AddMilliseconds(unixTime);
}

var date = FromUnixTime(1415115303410); // 11/4/2014 3:35:03 PM

由于您的数字是以毫秒为单位的,因此使用Unix时间,请使用AddMilliseconds


我不明白这与OP发布的有什么不同。但它确实有效。我认为正如@icemanind所说,OP的代码已经可以工作了。https://dotnetfiddle.net/pGF3km - crthompson
正确,这完全一样,我以为他在那里使用了 AddSeconds(从最后的编辑中感到困惑),不过,这才是正确的答案... - Ofiris

1

微软一直在考虑我们的需求!所有关于在Visual Studio 2017 (.Net 4.6.1)中添加秒/毫秒的解决方案都无效。但是现在有了一个新的解决方案:


public static DateTime numStrToDate(String val)
{
    DateTime dRet = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    long dSec;
    if (long.TryParse(val, out dSec))
    {
        TimeSpan ts = new TimeSpan(dSec*10l);
        dRet = dRet.Add(ts);
    }
    return dRet;
}

如果您需要UTC时间 - 只需在DateTime构造函数调用中添加'System.DateTimeKind.Utc'。

1
尝试这个。
DateTime date = new DateTime(Convert.ToInt64("1415115303410"));

2
虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。请尽量不要在代码中添加过多的解释性注释,这会降低代码和解释的可读性! - kayess

0

日期转时间戳

 DateTime date = DateTime.ParseExact(date_string, "dd/MM/yyyy H:mm:ss", null);
 Double timestamp = Math.Truncate((date.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds);

时间戳转日期

 DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Unspecified);
 dtDateTime = dtDateTime.AddSeconds(Double.Parse(arrayFinalResponse[i, 5])).ToLocalTime();
 String date = dtDateTime.ToString("dd/MM/yyyy H:mm:ss", CultureInfo.GetCultureInfo("en-US"));

-1

您可以使用date命令的小技巧进行转换。这取决于您所在的时区。我居住在UTC + 1,因此对我来说是这样的:

h1x1binax:~ # date -d "Thu Jan  1 01:00:00 CET 1970 + 1415115303410 second"
Thu Mar 21 09:16:50 CET 46813
h1x1binax:~ #

所以这不是Unix时间戳...它可能是毫秒级的,需要除以1000

h1x1binax:~ # date -d "Thu Jan  1 01:00:00 CET 1970 + 1415115303 second"
Tue Nov  4 16:35:03 CET 2014
h1x1binax:~ #

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接