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#时间戳获取与转换在实际项目中会经常使用,并结合各种其它情况配合对时间操作。

posted @ 2024-08-01 16:14  孔小爽  阅读(330)  评论(0编辑  收藏  举报
作者:孔小爽 引用请标明出处:https://www.cnblogs.com/kongxiaoshuang/