C# 时间和时间戳互转方法

什么是Unix时间戳?

Unix时间戳指:从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起到现在的时间间隔
一般会转化成:秒数(10位)或 毫秒(13位)

什么是Ticks?

Ticks指的是:从 0001年1月1日午夜12:00:00 以来所经历的100纳秒数,即 1 Ticks = 100 纳秒
冷知识:纳秒 又称为 毫微秒

1秒(s) = 1000毫秒(ms)
1毫秒 = 1000微秒(μs)
1微秒 = 1000纳秒(ns)

因此,1微秒 = 10 Ticks 丨 1秒 = 10000000 Ticks

通过Ticks计算时间戳:(long)new TimeSpan(DateTime.UtcNow.Ticks - 621355968000000000).TotalMilliseconds
其中数字【621355968000000000】表示从 0000年00月00日00时00分00秒 ~ 1970年01月01日00时00分00秒的刻度值
注意:当通过Ticks计算时间戳时,需要先将北京时间Local转为世界时间UTC,可通过DateTime.Now.Kind的值判断


时间转时间戳
/// <summary>
/// 获得时间戳(默认毫秒)
/// </summary>
/// <param name="time">时间</param>
/// <param name="isMilliseconds">是否毫秒级</param>
/// <returns>返回 秒(10位) 或 毫秒(13位)</returns>
public static long GetTimeStamp(this DateTime time, bool isMilliseconds = true)
{
    // 第一步:计算时间戳之前要先将中国时间转为UTC世界时间
    if (time.Kind != DateTimeKind.Utc) time = time.ToUniversalTime();

    // 第二步:获得时间戳
    var timeOffset = new DateTimeOffset(time);
    return isMilliseconds ? timeOffset.ToUnixTimeMilliseconds() : timeOffset.ToUnixTimeSeconds();

    /* 第二步:其他方式1
    var timeSpan = time - new DateTime(1970, 1, 1);
    return (long)(isMilliseconds ? timeSpan.TotalMilliseconds : timeSpan.TotalSeconds);
    */

    /* 第二步:其他方式2
    var timeSpan = new TimeSpan(time.Ticks - 621355968000000000);
    return (long)(isMilliseconds ? timeSpan.TotalMilliseconds : timeSpan.TotalSeconds);
    */
}
时间戳转时间
/// <summary>
/// 获得时间
/// </summary>
/// <param name="timeStamp">时间戳</param>
/// <param name="isMilliseconds">是否毫秒</param>
/// <returns>时间</returns>
public static DateTime GetDateTime(this long timeStamp, bool isMilliseconds = true)
{
    var timeOffset = isMilliseconds ? DateTimeOffset.FromUnixTimeMilliseconds(timeStamp) : DateTimeOffset.FromUnixTimeSeconds(timeStamp);
    return timeOffset.LocalDateTime;
}
posted @   天空科技  阅读(401)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示