在C#中,时间戳(TimeStamp)与时间(DateTime)之间的转换是常见的操作。时间戳通常指的是自某一特定时刻(如Unix纪元,即1970年1月1日午夜UTC)以来的秒数或毫秒数。在.NET中,我们通常处理的是毫秒数的时间戳,因为DateTime类型在内部就是以这种方式存储的。
时间(DateTime)转时间戳(毫秒)
要将DateTime转换为时间戳(毫秒),可以使用DateTime的Ticks
属性,并将其转换为毫秒。但是,更直接和常用的方法是使用DateTimeOffset
的ToUnixTimeMilliseconds
方法(对于Unix时间戳),或者通过计算与Unix纪元的时间差来手动获得毫秒数。
using System;
public class Program
{
public static void Main()
{
DateTime now = DateTime.UtcNow; // 或者 DateTime.Now 根据需要选择
long timestampMillis = now.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
// 或者使用 DateTimeOffset(.NET Framework 4.0+ 或 .NET Core)
DateTimeOffset nowOffset = DateTimeOffset.UtcNow;
long timestampMillisOffset = nowOffset.ToUnixTimeMilliseconds();
Console.WriteLine($"Timestamp (milliseconds): {timestampMillis}");
Console.WriteLine($"Timestamp (milliseconds using DateTimeOffset): {timestampMillisOffset}");
}
}
注意:DateTime.UtcNow
和DateTimeOffset.UtcNow
返回的是UTC时间。如果需要本地时间的时间戳,应该使用DateTime.Now
,但请注意时区差异可能会影响时间戳的计算。
时间戳(毫秒)转时间(DateTime)
要将时间戳(毫秒)转换回DateTime,可以使用Unix纪元(1970年1月1日午夜UTC)作为基准点,然后添加相应的毫秒数。
using System;
public class Program
{
public static void Main()
{
long timestampMillis = 1609459200000; // 示例时间戳
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(timestampMillis);
// 或者使用 DateTimeOffset
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestampMillis);
DateTime dateTimeFromOffset = dateTimeOffset.UtcDateTime; // 如果需要UTC时间
Console.WriteLine($"DateTime: {dateTime.ToString("yyyy-MM-dd HH:mm:ss")} UTC");
Console.WriteLine($"DateTimeOffset: {dateTimeFromOffset.ToString("yyyy-MM-dd HH:mm:ss")} UTC");
}
}
这里展示了两种将毫秒时间戳转换回DateTime的方法:直接使用DateTime和DateTimeKind.Utc,或者使用DateTimeOffset的FromUnixTimeMilliseconds
方法。注意,DateTimeOffset.UtcDateTime
属性返回的是UTC时间。如果需要本地时间,可以省略.UtcDateTime
部分,直接使用dateTimeOffset.DateTime
,但这将保留原始时区信息(如果有的话)。