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


У меня есть метка времени SQL-сервера, которую мне нужно преобразовать в представление времени в миллисекундах с 1970 года. Могу ли я сделать это с помощью простого SQL? Если нет, то я извлек его в DateTime переменная в C#. Можно ли получить миллисекундное представление этого ?

спасибо,
Тея.

7 55

7 ответов:

вы, вероятно, пытаетесь преобразовать в 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.

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

это не дает вам полной точности, но DATEDIFF(MS... вызывает переполнение. Если секунды достаточно хороши, это должно сделать это.

Это другое решение для скрытого datetime для 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;
} 

используя ответ Андома, это то, что я делаю

Вы можете создать структуру или класс, как этот

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

Я надеюсь, что это поможет вам

угловое говорит о date parater:

дата для форматирования либо как объект даты, миллисекунды (строка или число) или различные форматы строк ISO 8601 datetime (например yyyy-MM-ddTHH: mm: ss.sssZ и его более короткие версии, такие как yyyy-MM-ddTHH:mmZ, yyyy-MM-dd или yyyyMMddTHHmmssZ). Если нет часового пояса указанному в строке ввода, то время считается в местный часовой пояс.

Andomar-это преобразовать datetime в общей миллисекунды.

и вы должны посмотреть следующие ссылки.

https://docs.angularjs.org/api/ng/filter/date

учитывая объект DateTime, как я могу получить дату ISO 8601 в строковом формате?