18-значная метка времени для местного времени

Я наткнулся на базу данных Sq-lite. Я обнаружил, что наша дата и время хранятся в 18-значной метке времени.

Пожалуйста, помогите мне, как преобразовать его в местное время. (Я пытался преобразовать его (количество миллисекунд из 1900). Но я не понял. Он показывает разницу в 29 дней. Я добавил 29 дней миллисекунд ко времени. Но вывод времени неверен. Я предполагаю, что это будет время НТП.)

Здесь я даю 18-значную метку времени и эквивалентную дату и время.

Отметка времени Дата-время

362087070028927400 27-10-2014 15:06:57
362087302762879170 27-10-2014 15:22:06
362087302763135170 27-10-2014 15:22:06
362087302851460030 27-10-2014 15:22:06
362087302851716030 27-10-2014 15:22:06
362087302851716030 27-10-2014 15:22:06
362087305419799000 27-10-2014 15:22:16
362087307972777150 27-10-2014 15:22:26
362087310530875300 27-10-2014 15:22:36
362087313092045760 27-10-2014 15:22:46
362087315652448200 27-10-2014 15:22:56
362087318210802600 27-10-2014 15:23:06
362087320772741060 27-10-2014 15:23:16
362087323333655740 27-10-2014 15:23:26

Спасибо


person Muni Prasad    schedule 04.11.2014    source источник
comment
У вас нет кода, который создает эти временные метки?   -  person Jon Skeet    schedule 04.11.2014


Ответы (4)


Мне кажется, что он основан на 1970 году (эпоха Unix), а не на 1900 году, с 256000000 «тиков» в секунду.

Я раньше не встречал такого формата, но, похоже, он проверен — например, с использованием Noda Time:

using System;
using NodaTime;

class Test
{
    static void Main()
    {
        Console.WriteLine(ToInstant(362087323333655740));
    }

    static Instant ToInstant(long value)
    {
        // We don't have to truncate to milliseconds, but it's simple for now...
        long millis = value / 256000;
        return Instant.FromMillisecondsSinceUnixEpoch(millis);
    }
}

Выход:

2014-10-27T09:53:26Z

... что будет соответствовать 2014-10-27T15:23:26 как местному времени в Индии.

person Jon Skeet    schedule 04.11.2014
comment
Большое спасибо. Нужна ли мне библиотека Nodatime? - person Muni Prasad; 04.11.2014
comment
@MuniPrasad: Почти наверняка нет, но мы понятия не имеем, что вы пытаетесь сделать с этими данными... в вашем вопросе даже не говорится о том, какой язык/платформу вы используете. - person Jon Skeet; 04.11.2014
comment
@JonSkeet.Да, абсолютно, мне не нужен ответ на конкретном языке/платформе. Мне очень нужно, способ конвертировать. - person Muni Prasad; 04.11.2014
comment
Мне любопытно об этом. Это известная тиковая система? @MuniPrasad, можете ли вы сказать, откуда это? (если нет, я понимаю :) Это не похоже ни на что, что я видел раньше, и я не могу представить что-либо, что работает с такой точностью: это на уровне десятков пикосекунд? - person Sandman; 05.11.2014
comment
@TheSandman: Это не то, что я видел раньше, но это не обязательно много значит... - person Jon Skeet; 05.11.2014

Спасибо, Джон Скит.

Пробовал без NodaTime dll.

Мой код как в Vb.net;

Dim theDate As Date = New Date(1970, 1, 1, 0, 0, 0).AddMilliseconds(CLng(lstUnixTime.Items(k) / 256000L))
Dim offsetAmount As TimeSpan = TimeZone.CurrentTimeZone.GetUtcOffset(New Date(1900, 1, 1, 0, 0, 0))
theDate += offsetAmount

Теперь я получаю правильную дату.

Спасибо за ваш ценный ответ и ответ.

person Muni Prasad    schedule 04.11.2014
comment
Вы не должны добавлять смещение таким образом — вы можете создать DateTime с Kind из Utc и вызвать ToLocalTime, если хотите. Или, в конце концов, вы могли бы использовать Noda Time, что делает такие вещи более понятными, IMO :) - person Jon Skeet; 04.11.2014
comment
Это нормально: затемнить тики As Long = CLng(lstUnixTime.Items(k)/256000L) Dim UtcDate As New DateTime(1970, 1, 1) UtcDate = UtcDate.AddMilliseconds(ticks) Dim theDate As New DateTime(UtcDate.Ticks, DateTimeKind.Utc) theDate.ToLocalTime() - person Muni Prasad; 04.11.2014
comment
Почему бы просто не создать значение эпохи Unix DateTime с типом UTC для начала? Это имело бы больше смысла, ИМО. - person Jon Skeet; 04.11.2014
comment
Вы имеете в виду так: Dim ticks As Long = CLng(formatting.Value/256000L) Dim UtcDate As New DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc) UtcDate = UtcDate.AddMilliseconds(ticks) UtcDate .ToLocalTime() - person Muni Prasad; 04.11.2014
comment
Да, точно. Или просто используйте Noda Time :) - person Jon Skeet; 04.11.2014
comment
Спасибо. Как я могу использовать Noda-Time. Где я могу ее скачать. Это открытая лицензия или мне нужно ее купить? - person Muni Prasad; 04.11.2014
comment
Перейдите по ссылке в моем ответе :) Это с открытым исходным кодом и бесплатно. - person Jon Skeet; 04.11.2014
comment
Только то, что с DateTime очень легко ошибиться: blog.nodatime.org/2011/08/what-wrong-with-datetime-anyway.html - person Jon Skeet; 04.11.2014

для php

$dateLargeInt= "131424999530821857";
$secsAfterADEpoch = $dateLargeInt / (10000000);

$ADToUnixConvertor=((1970-1601) * 365.242190) * 86400; 
// unix epoch - AD epoch * number of tropical days * seconds in a day 
$unixTsLastLogon=intval($secsAfterADEpoch-$ADToUnixConvertor); 

// unix Timestamp version of AD timestamp
$lastlogon=date("d-m-Y", $unixTsLastLogon); // formatted date

echo $lastlogon;
person Saurabh Chandra Patel    schedule 29.06.2017

Вот решение, которое я сделал на Python, и оно хорошо сработало для меня (это для 18-значных временных меток LDAP/Active Directory):

import datetime

def ad_timestamp(timestamp):
    if timestamp != 0:
        return datetime.datetime(1601, 1, 1) + datetime.timedelta(seconds=timestamp/10000000)
    return np.nan

Итак, если вам нужно преобразовать столбец Pandas:

df.lastLogonTimestamp = df.lastLogonTimestamp.fillna(0).apply(ad_timestamp)

Примечание. Мне нужно было использовать fillna перед использованием apply. Кроме того, поскольку я заполнил 0, я проверил это в функции преобразования примерно, if timestamp != 0. Надеюсь, это имеет смысл. Это дополнительный материал, но он может вам понадобиться для преобразования рассматриваемого столбца.

person R.F.    schedule 06.11.2019