我有一个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);
我希望这对你有所帮助