将 DateTime 转换为 Unix 时间戳格式

Posted

技术标签:

【中文标题】将 DateTime 转换为 Unix 时间戳格式【英文标题】:Convert DateTime to Unix timestamp format 【发布时间】:2014-10-26 10:49:13 【问题描述】:

我再次来找你是因为我搜索了所有堆栈并且在找到一些类似的主题之后无论如何没有人在我的情况下工作。我请求你在一件事上支持我。我有这个代码:

static class UnixTime 
    private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    private static readonly long MaxUnixSeconds = (long)((DateTime.MaxValue - UnixEpoch).TotalSeconds);
    private const double LongAdj = 1000.0;
    public static DateTime ToDateTime(long unixTimeStamp)  return UnixEpoch.AddSeconds(unixTimeStamp / LongAdj); 
    public static long FromDateTime(DateTime date)  return (long)((date - UnixEpoch).TotalSeconds * LongAdj); 

    public static void Test(long n) 
        System.Diagnostics.Debug.WriteLine("UNIX Time = " + n);
        var dt = ToDateTime(n);
        System.Diagnostics.Debug.WriteLine("DateTime = " + dt);
        var fromDt = FromDateTime(dt);
        System.Diagnostics.Debug.WriteLine("UNIX Time = " + fromDt);
        System.Diagnostics.Debug.WriteLine("IsGood = " + (n==fromDt));
    

    public static void Test()  Test(1300123800440); 

它的输出是:

UNIX Time = 1300123800440
DateTime = 3/14/2011 5:30:00 PM
UNIX Time = 1300123800440
IsGood = True

它工作得很好。无论如何,我从上面的代码中提取了我需要传递 datetime 作为参数并获得 Unix 时间戳的代码,不幸的是它给了我不好的结果:

我是这样做的:

public static long ConvertDateTimeTo(string date)
        
            const double LongAdj = 1000.0;
            DateTime mydate = Convert.ToDateTime(date);
            DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            return (long)((mydate - UnixEpoch).TotalSeconds * LongAdj);
        

使用:

Console.WriteLine(ConvertDateTimeTo("14.03.2011 5:30 PM"));

输出(应该是 1300123800440)但我正在接收:

1300123800000

你能帮我看看这里出了什么问题吗?

【问题讨论】:

预期输入的时区是什么? (你能改变格式吗?) ***.com/questions/17632584/… 你从哪里得到 440 毫秒? 乔恩:UTC。 | UNIX 时间 1300123800440 等于 3/14/2011 5:30:00 PM @Notification 这不是 UNIX 时间,UNIX 时间是经过的秒数,而不是毫秒,即 10 亿秒(10 亿秒大约是 31 年)。 【参考方案1】:

你可以试试这个

static void Main(string[] args)
        
            Console.WriteLine(DateTime.Now);
            Console.ReadLine();
        

        public static long ToUnixTimestamp( DateTime target)
        
            var date = new DateTime(1970, 1, 1, 0, 0, 0, target.Kind);
            var unixTimestamp = System.Convert.ToInt64((target - date).TotalSeconds);

            return unixTimestamp;
        

        public static DateTime ToDateTime( DateTime target, long timestamp)
        
            var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, target.Kind);

            return dateTime.AddSeconds(timestamp);
        

编辑

这对我有用

在这里找到它: http://hassakarn.com/2012/10/10/convert-datetime-to-unix-timestamp-in-c/

【讨论】:

如果我像这样使用这个解决方案: DateTime mydate = Convert.ToDateTime("14.03.2011 5:30 PM"); Console.WriteLine(ToUnixTimestamp(DateTime.Now));我正在检索:1409655937 但应该是 14.03.2011 5:30 PM 使用 javascript 日期时,您必须将秒数乘(或除)1000。【参考方案2】:

看看这个吧:

public static void Test()  Test(13001238000000); 

给予:

Debug Trace: 
UNIX Time = 1300123800000 
DateTime = 2011-03-14 17:30:00
UNIX Time = 1300123800000 
IsGood = True

你的区别太小了,它是 440 毫秒,而且你不是在做 Unix 时间。 Unix 时间是经过的秒数,而不是自 1970-01-01 以来经过的毫秒数。

为了澄清,您得到相同“日期字符串”的原因是因为您只在日期字符串中显示秒,而不是毫秒。

【讨论】:

嗯,但如果看看我的例子,例如:1300123800440 = 14.03.2011 5:30 PM 1300124700345 = 14.03.2011 5:45 PM @Notification 1300123800000 = 14.03.2011 下午 5:30,1300123800440 = 14.03.2011 5:30 PM + 440 毫秒 我现在明白了。所以现在的主要问题是我是否想传递两个应该转换为 unix 时间并传递给 unix 服务器的日期时间。两个日期时间,例如:> = 14.03.2011 00:00:00 AM 和 虽然您没有使用 UNIX 时间,但您的值太大了 1000 倍,错误的幅度为 3。 1 300 123 800 是正确的时间戳,而不是 1 300 123 800 000,因此如果您发送的是 unix-time,那么您发送的是错误的值。 1 300 123 800 000 是 41 000 年,即 42 971 年,我猜这不是你想要的。 那么为什么在unix上我以这种格式得到它:1300123800440。从你的回答中,最后3个数字不应该在那里,但有。无论如何,转换后我可以只剪掉最后 3 位数字就可以了吗?【参考方案3】:

以毫秒为单位将 UTC 日期时间转换为 Unix/GMT/UTC 时间戳试试下面的函数。

public static long getUTCTimeInMilliseconds(DateTime utcDT)
        
            DateTime convertedDate = DateTime.SpecifyKind(utcDT, DateTimeKind.Utc);
            return new DateTimeOffset(convertedDate).ToUnixTimeMilliseconds();
        

【讨论】:

以上是关于将 DateTime 转换为 Unix 时间戳格式的主要内容,如果未能解决你的问题,请参考以下文章

将 datetime 转换为 Unix 时间戳并将其转换回 python

pandas使用to_datetime函数将unix时间戳转化为日期时间格式(Convert Unix times to DateTime)

MySQL将日期字符串转换为Unix时间戳

如何将 Unix 时间戳转换为 DateTime,反之亦然?

如何将 Unix 时间戳转换为 DateTime,反之亦然?

PHP-MYSQL:将 Unix 时间戳转换为 DateTime,反之亦然