Biểu diễn của DateTime tính bằng mili giây?


81

Tôi có dấu thời gian của máy chủ SQL mà tôi cần chuyển đổi thành biểu diễn thời gian tính bằng mili giây kể từ năm 1970. Tôi có thể thực hiện việc này với SQL thuần túy không? Nếu không, tôi đã trích xuất nó thành một DateTimebiến trong C #. Có thể có được một biểu diễn mili giây của điều này không?

Cảm ơn,
Teja.


1
Đối với câu hỏi sau :, các đối tượng DateTime (now - Epoch).TotalMillisecondsở đâu nowvà ở đâu Epoch.

Câu trả lời:


140

Có thể bạn đang cố gắng chuyển đổi sang dấu thời gian giống UNIX, ở UTC:

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

Điều này cũng tránh các vấn đề vào mùa hè, vì UTC không có những vấn đề đó.


2
điều này cung cấp một phân số dưới dạng đầu ra, ví dụ: "1552678714362.79" ".79" đến từ đâu?
Sharif Yazdian

2
@SharifYazdian Đó chính xác là những gì bạn mong đợi, nó là 0,79 mili giây. Thời gian của hệ thống được đo bằng tích tắc. Cho rằng 1 mili giây có 10000 tích tắc DateTimeTimeSpanlưu trữ giá trị của chúng với độ chính xác cao hơn toàn bộ mili giây. 0,79 ms = 7900 tích tắc. Nếu bạn cần một số nguyên, bạn có thể sử dụng long ms = myTimeSpan.TotalTicks / 10000;.
LWChris

2
Trong .NET Core (> 2.1), bạn có thể sử dụng DateTime.UnixEpochthay vì khai báo ngày tháng.
Thom

1
Mã này có một vấn đề: nó giả định DateTime(xem ghi chú trong hợp đồng của ToUniversalTime) là theo giờ địa phương mà không thể. Ví dụ: thông thường người ta lấy mẫu thời gian bằng DateTime.UtcNowhoặc có thể ở múi giờ khác.
ceztko

68

Trong C #, bạn có thể viết

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

15
Tôi đề xuất một dàn diễn viên longthay vì int:)
Jon Skeet

4
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);Nếu bạn muốn đi theo con đường khác.
JackMorrissey,

@JackMorrissey: AddMilliseconds()mong đợi một kiểu tham số double. Một chuyển đổi ngầm giải quyết vấn đề đó, nhưng nó có thể đáng chú ý.
Axel Kemper

@JonSkeet Tại sao bạn đề xuất truyền thành long thay vì int? :)
Roxy'Pro

4
@ Roxy'Pro: tính int.MaxValuebằng mili giây là khoảng 25 ngày. Điều đó không có ích.
Jon Skeet

35

Kể từ .NET 4.6, bạn có thể sử dụng một DateTimeOffsetđối tượng để lấy mili giây unix. Nó có một hàm tạo lấy một DateTimeđối tượng, vì vậy bạn có thể chỉ cần truyền vào đối tượng của mình như được minh họa bên dưới.

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

Như đã lưu ý trong các câu trả lời khác, hãy đảm bảo yourDateTimeđã Kindchỉ định chính xác hoặc sử dụng .ToUniversalTime()để chuyển đổi nó sang thời gian UTC trước.

Ở đây bạn có thể tìm hiểu thêm về DateTimeOffset.


1
ToUnixTimeMilliseconds () không thực sự tồn tại trong .Net 3.5.
NickLokarno

1
Theo MSDN , ToUnixTimeMilliseconds()khả dụng kể từ .NET 4.6
NM

1
@kayleeFrye_onDeck OP đang hỏi về một dấu thời gian được lấy từ cơ sở dữ liệu, vì vậy nhận xét của bạn về .Nowkhông áp dụng trực tiếp cho câu hỏi này.
Bob

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

Điều này không cung cấp cho bạn độ chính xác đầy đủ mà còn DATEDIFF(MS...gây tràn. Nếu giây là đủ tốt, điều này nên làm điều đó.


2

Giải pháp khác này cho datetime bí mật cho 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

Sử dụng câu trả lời của Andoma, đây là những gì tôi đang làm

Bạn có thể tạo một Cấu trúc hoặc một Lớp như thế này

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();
        }

    }

Và bạn có thể sử dụng điều này trong mã của mình như sau

DateTime dateTime = DateTime.Now;

double total = Date.GetTime(dateTime);

dateTime = Date.DateTimeParse(total);

Tôi hy vọng điều này sẽ giúp bạn


1

ToUnixTime()ToUnixTimeMs()các phương thức trong lớp DateTimeExtensions

DateTime.UtcNow.ToUnixTimeMs()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.