网上给出的方法一般是这样:
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public string GetTimeStamp()
{
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
或者
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalMilliseconds).ToString();
}
实际上获得的时间是有偏差的,后来我在StackOverflow上查到一个方法:
new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
这样获取的时间才是正确的,还是StackOverflow强大!
常见坑与推荐写法
时间戳的坑几乎都出在时区:用 DateTime.Now 减 1970 纪元得到的是"本地时区时间戳",与标准 Unix 时间戳相差 8 小时;用 TotalSeconds 还是 TotalMilliseconds 决定秒级与毫秒级,还要注意浮点截断。
- 推荐写法:DateTimeOffset.UtcNow.ToUnixTimeSeconds(),一行到位、无时区歧义;毫秒级用 ToUnixTimeMilliseconds();
- 与 Java 对接(System.currentTimeMillis 是毫秒)、与 JS Date.now()(毫秒)对齐时注意乘除 1000;
- PHP 的 time() 是秒级,混用前先确认对方口径;
- 数据库建议存 UTC,展示层再做本地化,避免"存的就是本地时间"的历史包袱。