конвертировать временную метку unix в миллисекундах в UTC и; форматирование даты python 3 [дубликат]

251
задан Martin Thoma 28 December 2014 в 20:47
поделиться

12 ответов

Мне кажется, что самый простой способ сделать это -

import datetime

epoch = datetime.datetime.utcfromtimestamp(0)

def unix_time_millis(dt):
    return (dt - epoch).total_seconds() * 1000.0
351
ответ дан Sophie Alpert 18 August 2018 в 18:51
поделиться
  • 1
    Пока это лучшее решение (если версия python & gt; 2.7). Поскольку реализация %s зависит от ОС! Таким образом, каждый хочет, чтобы код работал надежно, независимо от того, какая ОС, НИКОГДА не использовать %s. Для 2,3 & lt; py ver & lt; 2.7. Можно просто построить total_seconds() следующим образом: delta.days*86400+delta.seconds+delta.microseconds/1e6 – Wang 24 July 2012 в 11:32
  • 2
    note: dt должно быть в формате UTC (не локально). См. аналогичный ответ с поддержкой Python 2.6 / 3 – jfs 28 October 2012 в 21:50
  • 3
    amphibient: возврат вашего редактирования с момента подачи заявки docs. utcfromtimestamp - это метод класса datetime.datetime, и реплика, похоже, согласна. – Sophie Alpert 23 August 2013 в 08:47
  • 4
    Стоит упомянуть, что если все, что вам нужно, это настоящая временная метка unix, как определено здесь ru.wikipedia.org/wiki/Unix_time (и поэтому будет использовать только функцию unix_time из этого ответа), тогда вы должны обернуть delta .total_seconds () с int, чтобы избежать завершения с поплавком – corford 30 December 2014 в 12:20
  • 5
    Почему oh почему datetime.utcfromtimestamp(0) возвращает дату и время без tzinfo? Именно там, в имени метода, utc fromtimestamp. Чтобы сделать его не наивным, я должен сделать что-то вроде datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC). Это необходимо, если dt осведомлен о часовом поясе, или вы получите TypeError: can't subtract offset-naive and offset-aware datetimes – FGreg 1 September 2016 в 18:03

Вот еще одна форма решения с нормализацией вашего объекта времени:

def to_unix_time(timestamp):
    epoch = datetime.datetime.utcfromtimestamp(0) # start of epoch time
    my_time = datetime.datetime.strptime(timestamp, "%Y/%m/%d %H:%M:%S.%f") # plugin your time object
    delta = my_time - epoch
    return delta.total_seconds() * 1000.0
1
ответ дан arhoskins 18 August 2018 в 18:51
поделиться
from datetime import datetime
from calendar import timegm

# Note: if you pass in a naive dttm object it's assumed to already be in UTC
def unix_time(dttm=None):
    if dttm is None:
       dttm = datetime.utcnow()

    return timegm(dttm.utctimetuple())

print "Unix time now: %d" % unix_time()
print "Unix timestamp from an existing dttm: %d" % unix_time(datetime(2014, 12, 30, 12, 0))
7
ответ дан corford 18 August 2018 в 18:51
поделиться
  • 1
    timegm() работает только с utc. Он не использует tm_isdst, поэтому вы можете использовать utcnow.timetuple() вместо utcnow.utctimetuple(). Примечание: использование naive_local_datetime.utctimetuple() было бы неправильным. Он не переводит местное время на utc. Кроме того, timetuple() вызывает полоски секунды из результата (независимо от того, зависит ли это от приложения). Также задается вопрос о * миллисекундах, а не секундах – jfs 15 May 2014 в 19:52
  • 2
    Я предпочитаю использовать utcnow () и utctimetuple (), чтобы сделать код абсолютно понятным, что вы имеете дело с UTC (и, таким образом, любой, кто его читает, не должен помнить, что timegm - только UTC). utctimetuple () не подразумевает перевод на наивный объект dttm (следовательно, инициализация dttm с помощью utcnow ()). Также задайте вопрос о секундах или миллисекундах. – corford 17 May 2014 в 12:15
  • 3
    Примечание: должно было сказаться в последнем комментарии, я прочитал вопрос как подразумевающий, что ему нужны секунды или миллисекунды (возможно, моя ошибка). Для millis просто умножьте на 1000 (как подсказывает верхний скоринга). – corford 17 May 2014 в 12:23
  • 4
    utctimetuple() разделяет доли секунды. Умножение на 1000 не вернет их. – jfs 29 December 2014 в 02:14
  • 5
    Из-за того, как ОП задал этот вопрос, неясно, что ему нужно (т. Е. Истинная временная метка unix или временная метка с точностью до миллисекунды). Несмотря на это, оба вопроса уже заданы и отвечают в другом месте. Сказав это, я думаю, что ответы здесь являются самыми быстрыми и чистыми для людей, которые пытаются понять, и хорошо иллюстрируют различные решения проблемы. – corford 30 December 2014 в 12:07

В Python 3.3 добавьте новый метод.

datetime.timestamp()

https://docs.python.org/3.3/library/datetime.html#datetime.datetime.timestamp

75
ответ дан eshizhan 18 August 2018 в 18:51
поделиться
  • 1
    Примечание: .timestamp() метод предполагает, что наивное входное время и время находится в локальном часовом поясе (и местное время может быть неоднозначным). Если он находится в формате UTC, используйте dt.replace(tzinfo=timezone.utc).timestamp() вместо . – jfs 29 December 2014 в 02:12
  • 2
    datetime.timestamp () возвращает epoch секунд как float. Для получения miliseconds: int (datetime.timestamp () * 1000) – Solar.gy 2 August 2017 в 15:28
  • 3
    Этот ответ не является примером для копирования и вставки в духе документов, не относящихся к человеку, в docs.python.org/3/library/… - это: datetime.datetime.timestamp(datetime.datetime.now()) – MarkHu 1 February 2018 в 21:01
  • 4
    datetime.datetime.now( ).timestamp( ) работает также – gerardw 8 May 2018 в 21:38
  • 5
    В 3.6 (по крайней мере) datetime.timestamp () принимает наименьшую часовую зону (tzinfo = None), тогда как дата и время в UTC. Поэтому всегда лучше иметь свой часовой пояс: datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp(), но не (всегда), равный datetime.datetime.now().timestamp() (этот последний равен только остальным, если локальный tz - UTC ...) – Bluu 12 July 2018 в 14:28

Вот как я это делаю:

from datetime import datetime
from time import mktime

dt = datetime.now()
sec_since_epoch = mktime(dt.timetuple()) + dt.microsecond/1000000.0

millis_since_epoch = sec_since_epoch * 1000
11
ответ дан estani 18 August 2018 в 18:51
поделиться
  • 1
  • 2
    @ J.F.Sebastian Спасибо за головы! на самом деле не рассматривается dst. Если ваш сервер находится в локальном режиме вместо UTC, это будет иметь значение. Я еще не нашел какой-либо убедительной причины для установки серверов в чем угодно, кроме UTC. Мой мотив «писать UTC, читать по местному времени». так что вы всегда знаете, где вы остановились ... – estani 2 January 2015 в 17:04
  • 3
    Вы всегда можете использовать calendar.timegm вместо mktime, чтобы избежать проблемы mktime, пытаясь угадать часовой пояс. – Decko 30 March 2017 в 17:42

Вы можете использовать Delorean для перемещения в пространстве и времени!

import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch

http://delorean.readthedocs.org/ru/latest/quickstart.html & nbsp;

15
ответ дан Etaoin 18 August 2018 в 18:51
поделиться
>>> import datetime
>>> import time
>>> import calendar

>>> #your datetime object
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 3, 19, 13, 0, 9, 351812)

>>> #use datetime module's timetuple method to get a `time.struct_time` object.[1]
>>> tt = datetime.datetime.timetuple(now)
>>> tt
time.struct_time(tm_year=2013, tm_mon=3, tm_mday=19, tm_hour=13, tm_min=0, tm_sec=9,     tm_wday=1, tm_yday=78, tm_isdst=-1)

>>> #If your datetime object is in utc you do this way. [2](see the first table on docs)
>>> sec_epoch_utc = calendar.timegm(tt) * 1000
>>> sec_epoch_utc
1363698009

>>> #If your datetime object is in local timeformat you do this way
>>> sec_epoch_loc = time.mktime(tt) * 1000
>>> sec_epoch_loc
1363678209.0

[1] http://docs.python.org/2/library/datetime.html#datetime.date.timetuple

[2] http://docs.python.org/2/library/time.html

3
ответ дан Jinesh 18 August 2018 в 18:51
поделиться
13
ответ дан MarkHu 18 August 2018 в 18:51
поделиться
  • 1
    Почему голос? Pls дайте мне знать. – abc 3 August 2016 в 03:07
  • 2
    Работает только секунды, а не миллисекунды. – Christopher Bull 1 February 2017 в 12:31
  • 3
    @ChristopherBull Просто разделите количество миллисекунд на 1000, чтобы перейти к секундам – Jonas 1 February 2017 в 20:49
  • 4
    Вы неправильно поняли и ошиблись. Секунды готовы к использованию в вышеуказанных функциях. Вы можете преобразовать его в миллисекунды, но это будет точность секунды. – Christopher Bull 1 February 2017 в 20:57
  • 5
    Этот ответ использует модуль time, но OP спросил о модуле datetime. FWIW, самая простая текущая эпоха - int(time.time()) – MarkHu 1 February 2018 в 20:38
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000
0
ответ дан MattoTodd 18 August 2018 в 18:51
поделиться
  • 1
    Это не верно! Временной набор не включает миллисекунду, поэтому mktime не вернет эпоху с миллисекундным разрешением. В этом случае это бесполезно. – Wang 24 July 2012 в 10:19
  • 2
    @Wang - вы правы, сэр, это не возвращает миллисы, только секунды – MattoTodd 20 August 2012 в 23:34
  • 3
  • 4
    Если вы удалите * 1000, вы получите seconds_since_epoch. Активировать этот ответ, потому что сейчас меня не волнует миллисекунды. – Michael Scheper 27 April 2016 в 21:35
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000 
1312908481000

Или помощь модуля времени (и без форматирования даты):

>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0

Ответил с помощью: http://pleac.sourceforge.net/pleac_python/ dateandtimes.html

Документация:

85
ответ дан miku 18 August 2018 в 18:51
поделиться
  • 1
    Btw, strftime («% s») возвращает пустую строку для меня. Второй способ работает отлично. – Pavel Vlasov 6 April 2012 в 17:32
  • 2
    Только вторая точность – shuckc 22 November 2013 в 20:35
  • 3
    «% s» не поддерживается Python, например, он может отсутствовать в Windows. .timetuple() возвращает tm_isdst=-1, заставляет mktime() угадать. Он может ошибиться во время DST (вероятность ошибки +/- час 50%). И «% s», и mktime() могут использовать неправильное смещение utc для дат из прошлого. Вам нужен исторический временной пояс db, такой как предоставленный модулем pytz для надежного преобразования локального времени в метку времени POSIX (если ОС уже не предоставляет такой db) – jfs 15 May 2014 в 20:01
  • 4
    time.mktime(ts.timetuple()), где ts - объект datetime python – suhailvs 22 September 2014 в 09:19
  • 5
    @suhail: прочитайте мой комментарий выше о mktime/timetuple. Также timetuple() разделяет доли секунды, и точка вопроса заключается в том, чтобы получить метку времени с точностью до миллисекунды. – jfs 29 December 2014 в 02:18

Это другое решение для преобразования даты и времени в unix timestamp millis.

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
ответ дан samsanthosh2008 18 August 2018 в 18:51
поделиться

Немного кода панды:

import pandas

def to_millis(dt):
    return int(pandas.to_datetime(dt).value / 1000000)
1
ответ дан volhv 18 August 2018 в 18:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: