【问题标题】:How to convert Milliseconds to date format in C#?如何在 C# 中将毫秒转换为日期格式?
【发布时间】:2011-09-07 16:00:15
【问题描述】:

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

【问题讨论】:

  • 你说的是 Unix 风格的时间戳吗?
  • 毫秒相对于什么?毫秒数代表时间跨度,而不是确切日期 - 除非您知道自 X 特定日期以来有 N 毫秒。
  • 没有研究 - 已经有很多帖子回答了这个问题。
  • 从什么时候开始的毫秒数?

标签: c# datetime format milliseconds


【解决方案1】:

首先将您的毫秒转换为TimeSpan

var time = TimeSpan.FromMilliseconds(milliseconds);

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

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

【讨论】:

    【解决方案2】:

    新日期时间(numTicks * 10000)

    DateTime(long ticks) 构造函数是您所需要的。每个刻度代表 100 纳秒,因此乘以 10000 得到 1 毫秒。

    【讨论】:

    • 感谢@Paul,混淆了微秒和纳秒。
    【解决方案3】:

    如果毫秒是基于UNIX epoch time,那么你可以使用:

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

    【讨论】:

    • 或者只是 var posixTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    【解决方案4】:

    这对我有用:

    DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);
    

    如果需要,您可以从中获取 DateTime。

    【讨论】:

    • 请注意,这仅在 .NET 4.6 中引入
    【解决方案5】:

    给你:

    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);
            }
        }
    

    【讨论】:

    • 所有这些幻数都需要常量。但如果我不得不猜测(我会尝试一下),它们代表了 1970 年的神奇日期......以 1901 年的毫秒数为单位。
    【解决方案6】:

    此示例将演示一般概念,但您需要知道您的开始日期是 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);
    

    【讨论】:

      【解决方案7】:

      你可以构造你的datetime from 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"));
      

      【讨论】:

        【解决方案8】:
            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;            
        
            }
        

        【讨论】:

          【解决方案9】:

          这个问题应该有the answer you need

          短版:

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

          【讨论】:

          • 我不知道为什么这被接受了,但滴答声与毫秒不同。您需要将毫秒乘以 10000 才能获得 DateTime 构造函数的刻度。
          • 乘以 TimeSpan.TicksPerMillisecond(等于 10000)可能会更好
          猜你喜欢
          • 1970-01-01
          • 2011-12-18
          • 1970-01-01
          • 1970-01-01
          • 2019-10-21
          • 2016-02-25
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          相关资源
          最近更新 更多