Представлення DateTime в мілісекундах?


81

У мене є мітка часу SQL-сервера, яку мені потрібно перетворити на представлення часу в мілісекундах з 1970 року. Чи можу я це зробити за допомогою простого SQL? Якщо ні, я виділив його у DateTimeзмінну в C #. Чи можна отримати це представлення в мілісекундах?

Дякую,
Тея.


1
Для останнього питання:, (now - Epoch).TotalMillisecondsде nowі Epochє об’єкти DateTime.

Відповіді:


143

Ви, мабуть, намагаєтесь перетворити на позначку часу, схожу на UNIX, яка знаходиться в UTC:

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

Це також дозволяє уникнути літніх проблем, оскільки в UTC таких немає.


2
це дає дріб як вихід, наприклад: "1552678714362.79" Звідки береться ".79"?
Шаріф Яздіан

2
@SharifYazdian Це саме те, що ви очікували, це 0,79 мілісекунди. Системний час вимірюється кліщами. Враховуючи, що 1 мілісекунда має 10000 кліщів, DateTimeі TimeSpanзберігайте їх значення з більшою точністю, ніж цілі мілісекунди. 0,79 мс = 7900 кліщів. Якщо вам потрібно ціле число, ви можете використовувати long ms = myTimeSpan.TotalTicks / 10000;.
LWChris

2
У .NET Core (> 2.1) ви можете використовувати DateTime.UnixEpochзамість оголошення дати.
Том,

1
Цей код має проблему: він передбачає, що DateTime(дивіться примітку в договорі ToUniversalTime) місцевий час, чого не могло бути. Наприклад, загальноприйнято відбирати час, DateTime.UtcNowабо він може бути в іншому часовому поясі.
ceztko

70

У C # ви можете писати

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

15
Я пропоную акторський longсклад замість int:)
Джон Скіт

4
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);Якщо ви хочете піти іншим шляхом.
JackMorrissey

@JackMorrissey: AddMilliseconds()очікує параметера типу double. Неявне перетворення подбає про це, але, можливо, варто зазначити.
Аксель Кемпер,

@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
ToUnixTimeMilliseconds () насправді не існує в .Net 3.5.
NickLokarno

2
Згідно з MSDN , ToUnixTimeMilliseconds()доступний з .NET 4.6
NM

1
@kayleeFrye_onDeck ОП запитує про позначку часу, витягнуту з бази даних, тому ваш коментар щодо .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

Використовуючи відповідь Андоми, я цим займаюся

Ви можете створити структуру або клас, подібний до цього

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

Є ToUnixTime()іToUnixTimeMs() методи в класі DateTimeExtensions

DateTime.UtcNow.ToUnixTimeMs()

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.