Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Это также позволяет избежать проблем летнего времени, так как UTC не имеет этих данных.

Ответ 2

В С# вы можете написать

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

Ответ 3

Начиная с .NET 4.0, вы можете использовать объект DateTimeOffset для получения миллисекунд unix. Он имеет конструктор, который принимает объект DateTime, поэтому вы можете просто передать свой объект, как показано ниже.

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

Как указано в других ответах, убедитесь, что yourDateTime имеет правильный Kind указанный, или используйте .ToUniversalTime(), чтобы преобразовать его в время UTC.

Здесь вы можете узнать больше о DateTimeOffset.

Ответ 4

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

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

Ответ 5

Это другое решение для тайного datetime для unixtimestampmillis С#.

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

Ответ 6

angular говорит о date parater:

Дата для форматирования как объекта Date, миллисекунды (строка или номер) или различных форматов строки даты и времени ISO 8601 (например, 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 в формате строки?

Ответ 7

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

Вы можете создать Struct или класс, подобный этому

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

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

Ответ 8

Declare @MsPerDay bigint
Set @MsPerDay = 86400000

Declare @StartDate datetime
Set @StartDate = '19700101'

Declare @TargetDate datetime
Set @TargetDate = CURRENT_TIMESTAMP

Select DateDiff(d,@StartDate,@TargetDate) * @MsPerDay
    + DateDiff(ms,DateAdd(d,DateDiff(d,0,@TargetDate),0),@TargetDate)

В псевдокоде:

Дельта дней между 1970-01-01 и целевым временем жизни, умноженным на количество миллисекунд в день плюс миллисекунды с полуночи целевого времени и времени до момента целевого времени и времени.