我有一个SQL Server时间戳,自1970年以来,我需要将其转换为以毫秒为单位的时间表示形式。我可以使用普通SQL做到这一点吗?如果没有,我将其提取到DateTime
C#中的变量中。是否有可能对此进行毫秒表示?
谢谢
Teja
我有一个SQL Server时间戳,自1970年以来,我需要将其转换为以毫秒为单位的时间表示形式。我可以使用普通SQL做到这一点吗?如果没有,我将其提取到DateTime
C#中的变量中。是否有可能对此进行毫秒表示?
谢谢
Teja
Answers:
您可能正在尝试转换为UTC中类似UNIX的时间戳:
yourDateTime.ToUniversalTime().Subtract(
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
).TotalMilliseconds
这也避免了夏季问题,因为UTC没有这些问题。
DateTime
并TimeSpan
以比整毫秒更高的精度存储它们的值。0.79毫秒= 7900滴答。如果需要整数,可以使用long ms = myTimeSpan.TotalTicks / 10000;
。
DateTime.UnixEpoch
而不是声明日期。
DateTime
(请看合同中的注释ToUniversalTime
)在当地时间,而可能不是在当地时间。例如,通常使用采样时间,DateTime.UtcNow
也可能在另一个时区。
在C#中,您可以编写
(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds
long
而不是int
:)
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);
如果您想走另一条路。
AddMilliseconds()
期望类型的参数double
。隐式转换可以解决这一问题,但可能值得注意。
int.MaxValue
以毫秒为单位大约25天。这不太可能有用。
从.NET 4.6开始,您可以使用DateTimeOffset
对象获取Unix毫秒。它有一个带DateTime
对象的构造函数,因此您可以按照下面的说明传入对象。
DateTime yourDateTime;
long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();
如其他答案中所述,请确保指定yourDateTime
了正确的名称Kind
,或先使用.ToUniversalTime()
其将其转换为UTC时间。
在这里您可以了解更多有关DateTimeOffset
。
.Now
并不直接适用于此问题。
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或Class
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);
希望对您有帮助
(now - Epoch).TotalMilliseconds
,其中now
和Epoch
是DateTime对象。