将DateTime转换为Unix时间戳格式

时间:2014-09-02 08:18:01

标签: c#

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

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
你可以帮我解决这里的问题吗?

3 个答案:

答案 0 :(得分:3)

你可以试试这个

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/

答案 1 :(得分:0)

请看一下这个:

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以来经过的毫秒。

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

答案 2 :(得分:0)

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

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