一、时间格式化
时间格式:2000-01-01 00:00:00
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
二、获取当前时间戳
主要需要注意时区问题:
DateTime.Now 属性检索当前本地日期和时间
DateTime.UtcNow 属性检索通用协调 (UTC) 日期和时间
实现方法如下(统一使用UTC计算):
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
return Convert.ToInt64(ts.TotalMilliseconds).ToString();//精确到毫秒
}
以下方法统一采用本地时间(北京时区),得到同样结果,但不推荐。时区改变显然就不准确了。
public string GetTimeStamp()
{
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 8, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();//精确到秒
}
三、DateTime和时间戳的相互转换
.NET时间DateTime和时间戳的相互转换非常常用,网上找了很多例子,普遍存在两个问题:
1、利用TimeZone,在最新的.NET6上显示“TimeZone已过时”;
2、UTC与本地时间(北京时间)没处理好,转换后相差8小时。
实现代码如下:
public class DateTimeConvert
{
/// <summary>
/// 本时区日期时间转时间戳
/// </summary>
/// <param name="datetime"></param>
/// <returns>long=Int64</returns>
public static long DateTimeToTimestamp(DateTime datetime)
{
DateTime dd = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
DateTime timeUTC = datetime.ToUniversalTime();
TimeSpan ts = (timeUTC - dd);
return (Int64)ts.TotalMilliseconds;//精确到毫秒
}
/// <summary>
/// 时间戳转本时区日期时间
/// </summary>
/// <param name="timeStamp"></param>
/// <returns></returns>
public static DateTime TimestampToDateTime(string timeStamp)
{
DateTime dd = DateTime.SpecifyKind(new DateTime(1970, 1, 1, 0, 0, 0, 0), DateTimeKind.Local);
long longTimeStamp = long.Parse(timeStamp + "0000");
TimeSpan ts = new TimeSpan(longTimeStamp);
return dd.Add(ts);
}
}