Представление DateTime в миллисекундах?
У меня есть метка времени SQL-сервера, которую мне нужно преобразовать в представление времени в миллисекундах с 1970 года. Могу ли я сделать это с помощью простого SQL? Если нет, я извлек его в переменную DateTime
в С#. Возможно ли получить миллисекундное представление этого?
Спасибо,
Тея.
Ответы
Ответ 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
и целевым временем жизни, умноженным на количество миллисекунд в день плюс миллисекунды с полуночи целевого времени и времени до момента целевого времени и времени.