DateTime的表示单位是毫秒?


81

我有一个SQL Server时间戳,自1970年以来,我需要将其转换为以毫秒为单位的时间表示形式。我可以使用普通SQL做到这一点吗?如果没有,我将其提取到DateTimeC#中的变量中。是否有可能对此进行毫秒表示?

谢谢
Teja


1
对于后一个问题:(now - Epoch).TotalMilliseconds,其中nowEpoch是DateTime对象。

Answers:


140

您可能正在尝试转换为UTC中类似UNIX的时间戳:

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

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


2
这给出了一个分数作为输出,例如:“ 1552678714362.79”“ .79”从何而来?
Sharif Yazdian

2
@SharifYazdian正是您所期望的,它是0.79毫秒。系统时间以刻度为单位。假设1毫秒具有10000个刻度,DateTimeTimeSpan以比整毫秒更高的精度存储它们的值。0.79毫秒= 79​​00滴答。如果需要整数,可以使用long ms = myTimeSpan.TotalTicks / 10000;
LWChris '19

2
在.NET Core(> 2.1)中,您可以使用DateTime.UnixEpoch而不是声明日期。
汤姆(Thom)

1
这段代码有一个问题:它假定DateTime(请看合同中的注释ToUniversalTime)在当地时间,而可能不是在当地时间。例如,通常使用采样时间,DateTime.UtcNow也可能在另一个时区。
ceztko

68

在C#中,您可以编写

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

15
我建议投稿到,long而不是int:)
乔恩·斯基特

4
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);如果您想走另一条路。
JackMorrissey

@JackMorrissey:AddMilliseconds()期望类型的参数double。隐式转换可以解决这一问题,但可能值得注意。
Axel Kemper

@JonSkeet为什么您建议强制转换为long而不是int?:)
Roxy'Pro

4
@ Roxy'Pro:int.MaxValue以毫秒为单位大约25天。这不太可能有用。
乔恩·斯基特

35

从.NET 4.6开始,您可以使用DateTimeOffset对象获取Unix毫秒。它有一个带DateTime对象的构造函数,因此您可以按照下面的说明传入对象。

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

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

在这里您可以了解更多有关DateTimeOffset


1
.NET 3.5中实际上并不存在ToUnixTimeMilliseconds()。
NickLokarno

1
根据MSDN的信息ToUnixTimeMilliseconds()自.NET 4.6
NM

1
@kayleeFrye_onDeck OP正在询问从数据库中提取的时间戳,因此您的评论.Now并不直接适用于此问题。
鲍勃

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

这不会给您带来完全的精度,但是DATEDIFF(MS...会导致溢出。如果秒数足够好,则应该这样做。


2

另一种用于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;
} 

1

使用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);

希望对您有帮助


1

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

DateTime.UtcNow.ToUnixTimeMs()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.