C#时间戳的获取与转换
前言
时间戳是指时间从1970年01月01日00时00分00秒至现在的总秒数(北京时间是08时00分00秒),时间戳是使用数字签名技术产生的数据。在软件开发中处理时间戳是一种常见的操作。在C#中如何获取系统时间的时间戳、时间戳与日期的转换等。本文将介绍C#时间戳的一些基本使用。
时间戳
时间戳默认是Unix时间戳。它与JavaScript时间戳存在一点区别,前者是总秒数,而后者是总毫秒数。时间戳与时区无关。
转换
1、日期转换时间戳
// 当前时间 DateTime currentTime = DateTime.Now; // 当前时间转时间戳 #region 使用 TimeZone 类 DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0)); //除10000调整为13位 long timeStamp = (currentTime.Ticks - startTime.Ticks) / 10000; Console.WriteLine(timeStamp); #endregion #region 使用 TimeZoneInfo 类 DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)); TimeSpan elapsedTime = currentTime - startTime; long timestamp=(long)elapsedTime.TotalMilliseconds; Console.WriteLine(timestamp); #endregion #region 使用 DateTimeOffset .NET 4.6 及以上 DateTimeOffset dateTimeOffset =new DateTimeOffset(currentTime); long timeStamp = dateTimeOffset.ToUnixTimeMilliseconds(); Console.WriteLine(timeStamp); #endregion
2、时间戳转换日期
#region 时间戳长度 13 位 long timeStamp=1721442434723; DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)); DateTime dateTime = startTime.AddMilliseconds(timeStamp); Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH:mm:ss:ffff")); #endregion #region 时间戳长度 11 位 long timeStamp=1721442434; DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)); DateTime dateTime = startTimexx.AddSeconds(timestamp); Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH:mm:ss")); #endregion
示例
定义一个时间戳精确单位枚举
using System; namespace Fountain.WinConsole.UtilDemo { /// <summary> /// 时间戳精确单位 /// </summary> public enum Timestampunits { Second, Millisecond } }
定义一个时间戳处理类 TimeStamp
using System; namespace Fountain.WinConsole.UtilDemo { public class TimeStamp { /// <summary> /// 日期转时间戳 /// </summary> /// <param name="dateTime">时间</param> /// <param name="timestampunits">时间戳精确单位</param> /// <returns></returns> public static long ToTimestamp(DateTime dateTime, Timestampunits timestampunits) { DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)); TimeSpan elapsedTime = dateTime - startTime; long timestamp = (long)elapsedTime.TotalSeconds; if (timestampunits==Timestampunits.Millisecond) { timestamp = (long)elapsedTime.TotalMilliseconds; } return timestamp; } /// <summary> /// 时间戳转换为日期 /// </summary> /// <param name="timeStamp">时间戳</param> /// <returns></returns> public static DateTime ToDataTime(long timeStamp) { DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)); DateTime dateTime; if (timeStamp.ToString().Length==13) { dateTime = startTime.AddMilliseconds(timeStamp); } else { dateTime = startTime.AddSeconds(timeStamp); } return dateTime; } /// <summary> /// 当前时间的时间戳 /// </summary> /// <returns></returns> public static long GetTimestamp(Timestampunits timestampunits) { DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)); TimeSpan elapsedTime = DateTime.Now - startTime; long timestamp = (long)elapsedTime.TotalSeconds; if (timestampunits == Timestampunits.Millisecond) { timestamp = (long)elapsedTime.TotalMilliseconds; } return timestamp; } } }
调用使用
using System; namespace Fountain.WinConsole.UtilDemo { internal class Program { static void Main(string[] args) { // 获取当前时间的时间戳 Console.WriteLine(TimeStamp.GetTimestamp(Timestampunits.Millisecond)); // 时间转时间戳 long timestamp = TimeStamp.ToTimestamp(currentTime, Timestampunits.Millisecond); Console.WriteLine(timestamp); Console.WriteLine(TimeStamp.ToDataTime(timestamp)); Console.ReadKey(); } } }
小结
C#时间戳获取与转换在实际项目中会经常使用,并结合各种其它情况配合对时间操作。