Создайте Юлию Datetime из TimePeriod и StartDate - PullRequest
1 голос
/ 24 мая 2019

Я хочу преобразовать Int64, представляющее число микросекунд, прошедших с 12:00:00 до полуночи 1 января 0001 года (0:00:00 UTC 1 января 0001 года по григорианскому календарю), в дату времени Julia.

julia> time = Dates.Microsecond(6369175082331949400)

julia> Dates.format(time, "yyyymmdd HH:MM:SS.sss")

Ответы [ 4 ]

1 голос
/ 24 мая 2019

Если вам нужен DateTime, просто убедитесь, что ваш Int64 правильно указан в миллисекундах, и вы можете использовать (недокументированный) конструктор UTInstant, а затем позже добавить дробные микросекунды (комментарий: номер вашего примера, 6369175082331949400, кажется большим за недавнее григорианское время в микросекундах может быть наносекунда):

julia> using Dates


julia> t = now().instant
Dates.UTInstant{Millisecond}(63694318624788 milliseconds)

julia> dump(t)
Dates.UTInstant{Millisecond}
  periods: Millisecond
    value: Int64 63694318624788

julia> t2 = Dates.UTInstant(Millisecond(63691750823319))
Dates.UTInstant{Millisecond}(63691750823319 milliseconds)

julia> DateTime(t2)
2019-04-24T01:00:23.319

julia> t3 = DateTime(t2)+ Dates.Microsecond(494)
2019-04-24T01:00:23.319
1 голос
/ 24 мая 2019

Вы можете получить то, что вы хотите, используя Dates.epochms2datetime и применяя к нему корректировку для вашего случая, как показано ниже.

Давайте возьмем datetime_value в качестве интересующей нас датыПолучение:

datetime_value = Dates.DateTime(2019,1,1,0,0,0)
date_start = Dates.DateTime(1,1,1,0,0,0)

date_diff = datetime_value - date_start

Это дает вам значение 63681897600000 milliseconds для date_diff.Теперь Dates.epochms2datetime считает начало эпохи 0000-01-01T00:00:00.Поэтому нам нужно добавить 1 год и 1 день к результату после использования Dates.epochms2datetime, чтобы получить наше значение даты и времени из значения в миллисекундах:

julia> Dates.epochms2datetime(63681897600000) + Dates.Year(1) + Dates.Day(1)
2019-01-01T00:00:00
0 голосов
/ 07 июня 2019

Используя некоторые из предложенных идей, я придумал:

function convert_datetime(time)::DateTime
    num = div(time, 100000)
    remainder = rem(time, 100000)
    time = DateTime(Dates.UTInstant(Millisecond(num))) + Dates.Day(1)
    # time = Dates.epochms2datetime(trade.date_time/100000) + Dates.Year(1) + Dates.Day(1)
    time + Dates.Microsecond(remainder)
end
0 голосов
/ 24 мая 2019

Я не уверен, что полностью понимаю вопрос, так как Даты. Микросекунда просто возвращает значение Int64 даты или времени . Однако вы можете создать значение DateTime с определенной даты, а затем работать оттуда. Вычитание допускается для значений DateTime, а возвращает разницу в миллисекундах .

using Dates

dateThen = DateTime(1, 1, 1, 0, 0, 0)
dateNow = now(UTC)
diff = dateNow - dateThen
dump(diff * 1000)

Int64 63694261047549000 (или в другое время, когда вы его запускаете).

...