221

How do I create a datetime in Python from milliseconds? I can create a similar Date object in Java by java.util.Date(milliseconds).

Allocates a Date object and initializes it to represent the specified number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT.

Mateen Ulhaq
  • 24,552
  • 19
  • 101
  • 135
Joshua
  • 26,234
  • 22
  • 77
  • 106
  • related since seconds to milliseconds is just a factor: [Converting unix timestamp string to readable date](https://stackoverflow.com/q/3682748/10197418) – FObersteiner Sep 20 '21 at 08:32

5 Answers5

363

Just convert it to timestamp

datetime.datetime.fromtimestamp(ms/1000.0)
vartec
  • 131,205
  • 36
  • 218
  • 244
  • 31
    A note -- in Python 3, (/) will perform floating-point division. To perform integral division, use (//). – John Millikin Apr 14 '09 at 17:37
  • 5
    Don't you actually want float division anyway? Otherwise you're losing any precision below 1 second (held in the fractional part of the timestamp). Better to use ms/1000.0 with no truncation. – Brian Apr 14 '09 at 19:45
  • Not all platforms support fractional timestamps -- better to stick with POSIX's integers. – John Millikin Apr 14 '09 at 20:28
  • 4
    Surely datetime always supports it though? If we've got sub-second precision, it seems wrong to throw it away. If we don't there's no harm done - we just retain that original precision. – Brian Apr 14 '09 at 21:00
  • 52
    To keep the precision without using floats, you can also do: `datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000)` – tsg Nov 09 '12 at 22:43
  • 2
    another problem with this solution: "fromtimestamp() may raise ValueError, if the timestamp is out of the range of values supported by the platform C localtime() or gmtime() functions. It’s common for this to be restricted to years in 1970 through 2038." - how long is your code expected to last??? – mike rodent Jul 25 '15 at 09:53
  • It gives local time. How can I get gmt – Yajana Rao Sep 20 '18 at 13:13
  • WHY it gives an exception in the years before 1970? Aren't those years as well – canbax Apr 17 '20 at 11:44
20

Converting millis to datetime (UTC):

import datetime
time_in_millis = 1596542285000
dt = datetime.datetime.fromtimestamp(time_in_millis / 1000.0, tz=datetime.timezone.utc)
cahen
  • 15,807
  • 13
  • 47
  • 78
  • 2
    would be my accepted answer since Java's Date also refers to UTC by default (vs. Python's naive datetime / tz not set refers to *local time*). – FObersteiner Sep 20 '21 at 08:45
19

What about this? I presume it can be counted on to handle dates before 1970 and after 2038.

target_datetime_ms = 200000 # or whatever
base_datetime = datetime.datetime(1970, 1, 1)
delta = datetime.timedelta(0, 0, 0, target_datetime_ms)
target_datetime = base_datetime + delta

as mentioned in the Python standard lib:

fromtimestamp() may raise ValueError, if the timestamp is out of the range of values supported by the platform C localtime() or gmtime() functions. It’s common for this to be restricted to years in 1970 through 2038.

Very obviously, this can be done in one line:

target_dt = datetime(1970, 1, 1) + timedelta(milliseconds=target_dt_ms)

... not only was this obvious from my answer, but the 2015 comment by jfs is also highly misleading, because it calls the variable utc_time.

Er no: it's not "time", it's datetime, and it's most definitely NOT UTC. The datetime with which we're concerned here is a "timezone-naive" datetime, as opposed to a timezone-aware datetime. Therefore definitely NOT UTC.

Search on this if you're not familiar with the issue.

mike rodent
  • 14,126
  • 11
  • 103
  • 157
  • 10
    you could use `utc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis)` – jfs Jul 26 '15 at 01:55
17
import pandas as pd

Date_Time = pd.to_datetime(df.NameOfColumn, unit='ms')
Artem Krylov
  • 171
  • 1
  • 3
13

Bit heavy because of using pandas but works:

import pandas as pd
pd.to_datetime(msec_from_java, unit='ms').to_pydatetime()
mde
  • 334
  • 4
  • 9