การแปลงสตริงเวลาประทับยูนิกซ์เป็นวันที่อ่านได้


825

ฉันมีสตริงที่แสดงการประทับเวลา unix (เช่น "1284101485") ใน Python และฉันต้องการแปลงเป็นวันที่อ่านได้ เมื่อฉันใช้time.strftimeฉันได้รับTypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str

1
ลิงก์ไปยังคำถามสำหรับการแปลงกลับมาเช่นกัน: stackoverflow.com/q/19801727/3273031
slushy

คำตอบ:


1209

ใช้datetimeโมดูล:

from datetime import datetime
ts = int("1284101485")

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))

131
.fromtimestamp()อาจล้มเหลวสำหรับวันที่ผ่านมาหากเขตเวลาท้องถิ่นมีออฟเซ็ต utc ที่แตกต่างกัน คุณต้องการฐานข้อมูลเขตเวลาในอดีตเช่นจัดทำโดยpytzโมดูล (หรือระบบปฏิบัติการของคุณ) หรือเพียงแค่การทำงานในเวลา UTC .utcfromtimestamp()และการใช้งาน
jfs

9
@JFSebastian คุณได้กล่าวถึงสิ่งนี้แล้วอาจล้มเหลวในความคิดเห็นสองสามข้อ - โปรดช่วยอธิบายเพิ่มเติมหน่อยได้ไหมว่าทำไมมันถึงล้มเหลวสำหรับวัน / เวลาที่ผ่านมา? (ตัดสินโดย upvotes หลายคนเห็นด้วยกับคุณและเห็นสิ่งนี้ว่าตรงไปตรง) แน่นอนประทับเวลายูนิกซ์มีวันที่ / เวลาที่เทียบเท่าง่ายๆ?
davidhood2

3
@ davidhood2 ใช้ระบบที่ python ไม่สามารถเข้าถึงฐานข้อมูล tz (Windows) ตั้งค่าเขตเวลาท้องถิ่นของคุณเป็นเขตเวลาที่มี UTC ตรงข้ามที่แตกต่างกันในอดีต (เช่นยุโรป / มอสโก) โทร fromtimestamp () ด้วย timestamps จากอดีต (2011-) pytzเปรียบเทียบผลกับค่าที่คำนวณโดยใช้ ถ้ามันไม่ชัดเจน ถามคำถาม Stack Overflow แยกต่างหาก
jfs

3
@ davidhood2: ผมได้โพสต์คำตอบของฉันเองที่แสดงให้เห็นถึงpytzวิธีการแก้ปัญหา
jfs

6
จุดนำเข้านี้ใช้เวลาประทับในไม่กี่วินาทีนับตั้งแต่ยุค; หากคุณมีมิลลิวินาทีคุณต้องหารด้วย 1,000 ตามที่ฉันเพิ่งค้นพบ
wordoforthewise


145

คำตอบที่โหวตมากที่สุดแนะนำให้ใช้ fromtimestamp ซึ่งเป็นข้อผิดพลาดได้ง่ายเนื่องจากใช้เขตเวลาท้องถิ่น เพื่อหลีกเลี่ยงปัญหาแนวทางที่ดีกว่าคือการใช้ UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

โดยที่ posix_time คือเวลาของยุค Posix ที่คุณต้องการแปลง


2
นำเข้า datetime, pytz datetime.datetime (1990, 1, 1, tzinfo = pytz.utc)
y.selivonchyk

76
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'

10
time.ctime()และtime.localtime()อาจล้มเหลวสำหรับวันที่ผ่านมาหากเขตเวลาท้องถิ่นมีออฟเซ็ต utc ที่แตกต่างกัน คุณต้องการฐานข้อมูลเขตเวลาในอดีตเช่นจัดทำโดยpytzโมดูล (หรือระบบปฏิบัติการของคุณ) หรือเพียงแค่การทำงานในเวลา UTC time.gmtime()และการใช้งาน datetimeอาจให้ช่วงวันที่กว้างขึ้นดังนั้นจึงdatetime.utcfromtimestamp()สามารถใช้แทนtimeฟังก์ชันได้
jfs

66

มีสองส่วนคือ

  1. แปลงการประทับเวลา unix ("วินาทีนับตั้งแต่ยุค") เป็นเวลาท้องถิ่น
  2. แสดงเวลาท้องถิ่นในรูปแบบที่ต้องการ

วิธีแบบพกพาในการรับเวลาท้องถิ่นที่ใช้งานได้แม้ว่าเขตเวลาท้องถิ่นจะมีอ็อฟเซ็ต utc ที่แตกต่างกันในอดีตและไพ ธ อนไม่สามารถเข้าถึงฐานข้อมูล tz คือการใช้pytzเขตเวลา:

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)

ในการแสดงคุณสามารถใช้รูปแบบเวลาใดก็ได้ที่ระบบของคุณรองรับเช่น:

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format

หากคุณไม่ต้องการเวลาท้องถิ่นให้รับเวลา UTC ที่สามารถอ่านได้แทน:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

หากคุณไม่สนใจเกี่ยวกับปัญหาเขตเวลาที่อาจส่งผลต่อวันที่ที่ถูกส่งคืนหรือถ้าไพ ธ อนสามารถเข้าถึงฐานข้อมูล tz ในระบบของคุณ:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

บน Python 3 คุณจะได้รับ datetime ที่ทราบเขตเวลาโดยใช้เฉพาะ stdlib (อ็อฟเซ็ต UTC อาจผิดถ้า python ไม่สามารถเข้าถึงฐานข้อมูล tz บนระบบของคุณเช่นบน Windows):

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))

ฟังก์ชั่นจากtimeโมดูลเป็นตัวห่อรอบ ๆ C API ที่เกี่ยวข้องและดังนั้นพวกเขาอาจจะพกพาได้น้อยกว่าdatetimeวิธีที่สอดคล้องกันมิฉะนั้นคุณสามารถใช้พวกเขาด้วย:

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  

ควรเป็นคำตอบที่ได้รับการโหวตมากที่สุดหากคุณสนใจเวลาท้องถิ่น
azzamsa

36

สำหรับการประทับเวลาที่มนุษย์อ่านได้จากการประทับเวลา UNIX ฉันได้ใช้สิ่งนี้ในสคริปต์ก่อนหน้านี้:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

เอาท์พุท:

'26 ธันวาคม 2012'


25

คุณสามารถแปลงเวลาปัจจุบันเช่นนี้

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

เพื่อแปลงวันที่ในสตริงเป็นรูปแบบที่แตกต่างกัน

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013

24

นอกเหนือจากการใช้แพ็กเกจเวลา / วันที่แล้วแพนด้ายังสามารถใช้เพื่อแก้ปัญหาเดียวกันนี่คือวิธีที่เราสามารถใช้แพนด้าเพื่อแปลงเวลาประทับเป็นวันที่อ่านได้ :

การประทับเวลาสามารถอยู่ในสองรูปแบบ:

  1. 13 หลัก (มิลลิวินาที) - หากต้องการแปลงมิลลิวินาทีเป็นวันที่ให้ใช้:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 หลัก (วินาที) - หากต้องการแปลงวินาทีให้เป็นวันที่ให้ใช้:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'

ดูเหมือนว่าการชนะจะเป็นหมีแพนด้า - โมดูลนั้นยอดเยี่ยมในทุกสิ่ง
VaidøtasIvøška

21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

รับวันที่อ่านได้จากการประทับเวลาพร้อมเวลาด้วยนอกจากนี้คุณยังสามารถเปลี่ยนรูปแบบของวันที่ได้


5
อะไรคำตอบนี้เพิ่มนี้คำตอบ?
kocica

1
โปรดเพิ่มคำเตือนที่เกี่ยวข้องกับปัญหาของข้อสมมติเขตเวลาท้องถิ่น แนวทางปฏิบัติที่ดีที่สุดในการเขียนโปรแกรมคือการจัดเก็บการประทับเวลาเป็นเวลา UTC แทนการประทับเวลาท้องถิ่น แต่ตัวอย่างนี้ด้านบนจะส่งคืนเวลาผิดถ้าเขตเวลาท้องถิ่นไม่ใช่ UTC
Timothy C. Quinn

20

ใน Python 3.6+:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

เอาท์พุท:

2020-01-15 19:51:41

คำอธิบาย:



6

อีกวิธีหนึ่งที่สามารถทำได้โดยใช้ gmtime และฟังก์ชั่นรูปแบบ;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

เอาท์พุท: 2018-10-4 11:57:44


1

ฉันเพิ่งใช้สำเร็จ:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date

0

ซับอย่างรวดเร็วและสกปรก:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-5-1-9-43'


3
หรือรัดกุมมากขึ้น: '-' เข้าร่วม (แผนที่ (str, datetime.datetime.now (). timetuple () [: 6]))
Jelle Zijlstra

2
@ JelleZijlstra Eh ฉันชอบนิพจน์ตัวสร้างมากกว่าแผนที่
crhodes

4
รูปแบบวันที่แบบใดที่ '2013-5-5-1-1-43-43' ฉันไม่เคยเห็นรูปแบบนี้ทุกที่ในฐานะตัวแทนที่ถูกต้องของวันที่ / เวลา
madoki

คุณสามารถอธิบายอย่างละเอียดเกี่ยวกับสิ่งที่มีคุณสมบัตินี้ในฐานะตัวแทนที่ไม่ถูกต้อง @madoki หรือไม่? คุณหมายถึงไม่เป็นมาตรฐาน? ข้อได้เปรียบหลักที่มีมากกว่าคำตอบอื่น ๆ ส่วนใหญ่คือความสามารถในการรวมไว้ในไฟล์หรือเส้นทางไดเรกทอรีเนื่องจากช่องว่างและเครื่องหมายโคลอนไม่ได้อยู่ในชุดของอักขระไดเรกทอรี unix มาตรฐาน ดูเช่นstackoverflow.com/a/458001/209246
eqzx

0

คุณสามารถใช้easy_dateเพื่อทำให้ง่าย:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

5
ทุกโปรแกรมมีตัวแปลงวันที่และเวลาเป็นของตัวเอง หนึ่งไม่ควรต้องใช้ mods / framework สำหรับเรื่องนี้
JosFabre

strptimeและstrftimeไม่ง่าย ... และแม้กระทั่งไม่สามารถอ่านได้ ... แต่ฉันเข้าใจและเคารพความคิดเห็นของคุณ
Raphael Amoedo

4
สิ่งที่ควร "ไม่จำเป็นต้องใช้" นั้นผิด ขึ้นอยู่กับภาษาและคุณภาพของ libs ในตัว Javascript มี moment.js และ Java มีเวลา Joda ซึ่งทั้งคู่ได้รับความนิยมมากกว่าการแปลงวันที่และเวลาที่มีอยู่ภายในนั้น ที่กล่าวไว้เว้นแต่ว่าคำถามจะขอให้ห้องสมุดของบุคคลที่สามเป็นที่พอใจก็ควรที่จะให้คำตอบตามมาตรฐานของห้องสมุด
Hejazzman

ฉันยืน @NikosVentouras ที่แก้ไขแล้ว ฉันเพิ่งมีปัญหา "วันที่ JS ใน IE ทำงานแตกต่างกัน" เป็นครั้งแรก ดังนั้นฉันจึงลงเอยด้วย moment.js
JosFabre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.