软件编程
位置:首页>> 软件编程>> C#编程>> C#实现时间戳与标准时间的互转

C#实现时间戳与标准时间的互转

作者:宁静致远~  发布时间:2023-07-16 08:09:38 

标签:C#,时间戳,标准时间

前言

C# 时间戳与 标准时间的转其实不难,但需要注意下,基准时间的问题。

格林威治时间起点: 1970 年 1 月 1 日的 00:00:00.000

北京时间起点:1970 年 1 月 1 日的 08:00:00.000

昨天我在这里踩坑了,我用的是格林威治时间计算的时间戳,给计算机监控系统。计算机监控系统拿到时间戳换算后的时间总是跟我的对不上。后来发现是这个原因;

1.标准时间转时间戳的方法


/// <summary>
       /// 获取开停机的时间戳
       /// </summary>
       /// <param name="dtime"></param>
       /// <returns></returns>
       public int getTimeSpan(DateTime dtime)
       {
           //格林威治时间
           //var timeSpan_Greenwich = dtime - new DateTime(1970, 1, 1, 0, 0, 0);
           //标准北京时间
           var timeSpan = dtime - new DateTime(1970, 1, 1, 8, 0, 0);
           //或者这样写北京标准时间
           var timeSpan_beijing = dtime - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0));
          return (int)timeSpan.TotalSeconds;        }

2.时间戳转为标准时间


/// <summary>  
       /// 时间戳Timestamp转换成日期  
       /// </summary>  
       /// <param name="timeStamp"></param>  
       /// <returns></returns>  
       private DateTime GetDateTime(int timeStamp)
       {
           SaveCommand("timeStamp:" + timeStamp);

DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
           long lTime = ((long)timeStamp * 10000000);
           TimeSpan toNow = new TimeSpan(lTime);
           DateTime targetDt = dtStart.Add(toNow);

if (string.IsNullOrEmpty(targetDt.ToString()))
           {
               targetDt = DateTime.Now;
           }

SaveCommand("time:" + targetDt.ToString());

return targetDt;
       }

3.TimeZone.CurrentTimeZone.ToLocalTime()方法

C#实现时间戳与标准时间的互转

这个方法将一个 DateTime 对象,获取其值为对应于 time 的本地时间。可以看到这个方法格林威治的时间 1970-01-01 00:00:00 转为了北京时间 1970-01-01 08:00:00

补充

C#时间戳和格式化日期互转


</pre><pre name="code" class="csharp">using UnityEngine;  
using System.Collections;  
using System;  

/// <summary>  
/// C#时间格式转换为时间戳(互转)  
/// 时间戳定义为从格林威治时间 1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。  
/// </summary>  
public class DateTime_TimeStamp : MonoBehaviour  
{  
   protected int m_timestamp;  

/// <summary>  
   /// 获取时间戳Timestamp    
   /// </summary>  
   /// <param name="dt"></param>  
   /// <returns></returns>  
   private int GetTimeStamp(DateTime dt)  
   {  
       DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0);  
       int timeStamp = Convert.ToInt32((dt - dateStart).TotalSeconds);  
       return timeStamp;  
   }  

/// <summary>  
   /// 时间戳Timestamp转换成日期  
   /// </summary>  
   /// <param name="timeStamp"></param>  
   /// <returns></returns>  
   private DateTime GetDateTime(int timeStamp)  
   {  
       DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));  
       long lTime = ((long)timeStamp * 10000000);  
       TimeSpan toNow = new TimeSpan(lTime);  
       DateTime targetDt = dtStart.Add(toNow);  
       return targetDt;  
   }  

/// <summary>  
   /// 时间戳Timestamp转换成日期  
   /// </summary>  
   /// <param name="timeStamp"></param>  
   /// <returns></returns>  
   private DateTime GetDateTime(string timeStamp)  
   {  
       DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));  
       long lTime = long.Parse(timeStamp + "0000000");  
       TimeSpan toNow = new TimeSpan(lTime);  
       DateTime targetDt = dtStart.Add(toNow);  
       return dtStart.Add(toNow);  
   }  

void OnGUI()  
   {  
       if (GUILayout.Button("获取当前时间的时间戳"))  
       {  
           DateTime dtNow = DateTime.Now;  
           m_timestamp = GetTimeStamp(dtNow);  
           Debug.Log(string.Format("获取当前时间的时间戳 = {0} -> {1}", dtNow.ToString("yyyy-MM-dd hh:mm:ss"), m_timestamp));  
       }  

if (GUILayout.Button("将时间戳转换成日期_1"))  
       {  
           DateTime dt = GetDateTime(m_timestamp);  
           Debug.Log(string.Format("将时间戳转换成日期_1 = {0} -> {1}", m_timestamp, dt.ToString("yyyy-MM-dd hh:mm:ss")));  
       }  

if (GUILayout.Button("将时间戳转换成日期_2"))  
       {  
           DateTime dt = GetDateTime(m_timestamp.ToString());  
           Debug.Log(string.Format("将时间戳转换成日期_2 = {0} -> {1}", m_timestamp, dt.ToString("yyyy-MM-dd hh:mm:ss")));  
       }  
   }  
}

来源:https://www.cnblogs.com/motion/archive/2021/12/23/15721992.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com