日期时间的表示形式(以毫秒为单位)

本文关键字:为单位 时间 表示 日期 | 更新日期: 2023-09-27 17:56:17

我有一个SQL服务器时间戳,我需要将其转换为自1970年以来以毫秒为单位的时间表示形式。我可以用普通 SQL 做到这一点吗?如果没有,我已将其提取到 C# 中的 DateTime 变量中。是否有可能获得此的毫秒表示?

谢谢,
特哈。

日期时间的表示形式(以毫秒为单位)

您可能

正在尝试转换为类似UNIX的时间戳,该时间戳采用UTC格式:

yourDateTime.ToUniversalTime().Subtract(
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    ).TotalMilliseconds

这也避免了夏季问题,因为UTC没有这些问题。

在 C# 中,你可以写

(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds

从 .NET 4.6 开始,可以使用 DateTimeOffset 对象来获取 unix 毫秒。它有一个构造函数,它接受一个DateTime对象,所以你可以只传入你的对象,如下所示。

DateTime yourDateTime;
long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();

如其他答案中所述,请确保yourDateTime指定了正确的Kind,或者先使用 .ToUniversalTime() 将其转换为 UTC 时间。

在这里,您可以了解有关DateTimeOffset的更多信息。

DateTimeExtensions 类中有 ToUnixTime()ToUnixTimeMs() 方法

DateTime.UtcNow.ToUnixTimeMs()

SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000

这不会为您提供完全的精度,但DATEDIFF(MS...会导致溢出。 如果秒数足够好,这应该可以做到。

另一个

隐蔽日期时间到 unixtimestampmillis C# 的解决方案。

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long GetCurrentUnixTimestampMillis()
{
    DateTime localDateTime, univDateTime;
    localDateTime = DateTime.Now;          
    univDateTime = localDateTime.ToUniversalTime();
    return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
} 

使用Andoma的答案,这就是我正在做的

您可以创建一个结构或类,如下所示

struct Date
    {
        public static double GetTime(DateTime dateTime)
        {
            return dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
        }
        public static DateTime DateTimeParse(double milliseconds)
        {
            return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds).ToLocalTime();
        }
    }

您可以在代码中使用它,如下所示

DateTime dateTime = DateTime.Now;
double total = Date.GetTime(dateTime);
dateTime = Date.DateTimeParse(total);

我希望这对你有所帮助