如何在C#中将毫秒转换为日期格式?

29
在C#中如何将Unix风格的时间戳转换为yyyy-MM-ddThh:mm:ssZ格式?

你是在说 Unix 风格的时间戳吗? - Jerod Venema
2
毫秒相对于什么?一定数量的毫秒会表示一段时间,而不是精确日期——除非你知道自从特定日期X以来有N毫秒。 - driis
不需要研究 - 已经有很多帖子回答了这个问题。 - Chuck Savage
从什么时候开始算起的毫秒数? - Paul Walls
9个回答

33

开始将您的毫秒转换为 TimeSpan

var time = TimeSpan.FromMilliseconds(milliseconds);

现在,在 .NET 4 中,您可以使用格式化字符串参数调用 .ToString()。请参见http://msdn.microsoft.com/en-us/library/system.timespan.tostring.aspx

在以前的 .NET 版本中,您需要手动从 TimeSpan 的属性构建格式化字符串。


24

使用 DateTime(long ticks) 构造函数即可。每个tick代表100纳秒,因此乘以10000即可得到1毫秒。

新的DateTime对象将会被创建并以numTicks * 10000所表示的时间距离自0001年1月1日午夜以来的100纳秒间隔为基础。


谢谢@Paul,我混淆了微秒和纳秒。 - Babak Naffas

20

如果毫秒基于UNIX纪元时间,那么您可以使用以下方法:

var posixTime = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc);
var time = posixTime.AddMilliseconds(milliSecs);

2
或者只是 var posixTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); - Pal

9
这对我很有用:
DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);

如果需要,您可以仅获取日期时间。


请注意,这仅在.NET 4.6中引入。 - mintsponge

4

这里是您需要的内容:

public static class UnixDateTime
    {
        public static DateTimeOffset FromUnixTimeSeconds(long seconds)
        {
            if (seconds < -62135596800L || seconds > 253402300799L)
                throw new ArgumentOutOfRangeException("seconds", seconds, "");

            return new DateTimeOffset(seconds * 10000000L + 621355968000000000L, TimeSpan.Zero);
        }

        public static DateTimeOffset FromUnixTimeMilliseconds(long milliseconds)
        {
            if (milliseconds < -62135596800000L || milliseconds > 253402300799999L)
                throw new ArgumentOutOfRangeException("milliseconds", milliseconds, "");

            return new DateTimeOffset(milliseconds * 10000L + 621355968000000000L, TimeSpan.Zero);
        }

        public static long ToUnixTimeSeconds(this DateTimeOffset utcDateTime)
        {
            return utcDateTime.Ticks / 10000000L - 62135596800L;
        }

        public static long ToUnixTimeMilliseconds(this DateTimeOffset utcDateTime)
        {
            return utcDateTime.Ticks / 10000L - 62135596800000L;
        }

        [Test]
        public void UnixSeconds()
        {
            DateTime utcNow = DateTime.UtcNow;
            DateTimeOffset utcNowOffset = new DateTimeOffset(utcNow);

            long unixTimestampInSeconds = utcNowOffset.ToUnixTimeSeconds();

            DateTimeOffset utcNowOffsetTest = UnixDateTime.FromUnixTimeSeconds(unixTimestampInSeconds);

            Assert.AreEqual(utcNowOffset.Year, utcNowOffsetTest.Year);
            Assert.AreEqual(utcNowOffset.Month, utcNowOffsetTest.Month);
            Assert.AreEqual(utcNowOffset.Date, utcNowOffsetTest.Date);
            Assert.AreEqual(utcNowOffset.Hour, utcNowOffsetTest.Hour);
            Assert.AreEqual(utcNowOffset.Minute, utcNowOffsetTest.Minute);
            Assert.AreEqual(utcNowOffset.Second, utcNowOffsetTest.Second);
        }

        [Test]
        public void UnixMilliseconds()
        {
            DateTime utcNow = DateTime.UtcNow;
            DateTimeOffset utcNowOffset = new DateTimeOffset(utcNow);

            long unixTimestampInMilliseconds = utcNowOffset.ToUnixTimeMilliseconds();

            DateTimeOffset utcNowOffsetTest = UnixDateTime.FromUnixTimeMilliseconds(unixTimestampInMilliseconds);

            Assert.AreEqual(utcNowOffset.Year, utcNowOffsetTest.Year);
            Assert.AreEqual(utcNowOffset.Month, utcNowOffsetTest.Month);
            Assert.AreEqual(utcNowOffset.Date, utcNowOffsetTest.Date);
            Assert.AreEqual(utcNowOffset.Hour, utcNowOffsetTest.Hour);
            Assert.AreEqual(utcNowOffset.Minute, utcNowOffsetTest.Minute);
            Assert.AreEqual(utcNowOffset.Second, utcNowOffsetTest.Second);
            Assert.AreEqual(utcNowOffset.Millisecond, utcNowOffsetTest.Millisecond);
        }
    }

1
你需要为所有的那些神奇数字设置常量。但如果我猜对了的话(我会试一下),它们代表那个魔幻的1970年日期..从1901年算起的毫秒数。 - Gerard ONeill

3

这个示例将演示一般思路,但是您需要知道如果您的起始日期是DateTime.MinValue还是其他时间:

int ms = 1000;                          // One second
var date = new DateTime(ms * 10000);    // The constructor takes number of 100-nanoseconds ticks since DateTime.MinValue (midnight, january 1st, year 1)
string formatted = date.ToString("yyyy-MM-ddTHH:mm:ssZ");
Console.WriteLine(formatted);

1
你可以使用ticks构造日期时间
long ticks = new DateTime(1979, 07, 28, 22, 35, 5, 
  new CultureInfo("en-US", false).Calendar).Ticks;
DateTime dt3 = new DateTime(ticks);
Console.Write(dt3.ToString("yyyy-MM-ddThh:mm:ssZ"));

0
    private static DateTime Milliseconds2Date(Double d)
    {         
        TimeSpan time = TimeSpan.FromMilliseconds(d);
        return new DateTime(1970, 1, 1) + time;
    }

    private static Double Date2Milliseconds(DateTime d)
    {

        var t = d.Subtract(new DateTime(1970, 1, 1));
        return t.TotalMilliseconds;            

    }

-5

这个问题应该有你需要的答案

简短版:

DateTime date = new DateTime(long.Parse(ticks));
date.ToString("yyyy-MM-ddThh:mm:ssZ");

33
我不确定为什么这会被接受,但是“ticks”并不等同于“milliseconds”。你需要将毫秒乘以10000才能在DateTime构造函数中得到ticks。 - Yoten
1
最好乘以TimeSpan.TicksPerMillisecond(等于10000)。 - infografnet

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