在 C# 中,如何将 Unix 样式的时间戳转换为 yyyy-MM-ddThh:mm:ssZ?
问问题
84896 次
9 回答
33
首先将您的毫秒转换为TimeSpan
:
var time = TimeSpan.FromMilliseconds(milliseconds);
现在,在 .NET 4 中,您可以.ToString()
使用格式字符串参数进行调用。请参阅http://msdn.microsoft.com/en-us/library/system.timespan.tostring.aspx
在以前版本的 .NET 中,您必须从 TimeSpan 的属性手动构造格式化字符串。
于 2011-09-07T16:05:58.433 回答
24
新日期时间(numTicks * 10000)
DateTime(long ticks)构造函数是您所需要的。每个刻度代表 100 纳秒,因此乘以 10000 得到 1 毫秒。
于 2011-09-07T16:04:14.897 回答
20
如果毫秒基于UNIX 纪元时间,那么您可以使用:
var posixTime = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc);
var time = posixTime.AddMilliseconds(milliSecs);
于 2014-06-28T07:02:02.103 回答
9
这对我有用:
DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);
如果需要,您可以从中获取 DateTime。
于 2017-05-24T18:04:23.913 回答
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);
}
}
于 2015-05-28T23:16:32.217 回答
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);
于 2011-09-07T16:08:42.460 回答
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"));
于 2011-09-07T16:03:24.470 回答
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;
}
于 2018-12-15T10:47:42.773 回答
-5
这个问题应该有你需要的答案。
简洁版本:
DateTime date = new DateTime(long.Parse(ticks));
date.ToString("yyyy-MM-ddThh:mm:ssZ");
于 2011-09-07T16:06:15.937 回答