यूनिक्स टाइमस्टैम्प स्ट्रिंग को पठनीय तारीख में बदलना


825

मेरे पास पायथन में एक यूनिक्स टाइमस्टैम्प (यानी "1284101485") का प्रतिनिधित्व करने वाला एक स्ट्रिंग है, और मैं इसे एक पठनीय तारीख में बदलना चाहता हूं। जब मैं उपयोग करता हूं 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मॉड्यूल (या आपके ओएस) द्वारा प्रदान किया गया है । या सिर्फ यूटीसी में काम करें और उपयोग करें .utcfromtimestamp()
1

9
@JFSebastian आपने उल्लेख किया है कि यह टिप्पणी के एक जोड़े में विफल हो सकता है - क्या आप इसे विस्तृत रूप से बता सकते हैं कि यह पिछली तारीखों / समय के लिए विफल क्यों होगा? (अपवित्रों को देखते हुए, बहुत से लोग दोनों आपसे सहमत हैं और इसे सीधे तौर पर देखते हैं) निश्चित रूप से किसी भी यूनिक्स टाइमस्टैम्प में एक साधारण समकक्ष तिथि / समय होता है?
davidhood2

3
@ davidhood2 एक ऐसी प्रणाली लेता है जहां अजगर के पास tz डेटाबेस (विंडोज) तक कोई पहुंच नहीं है , अपने स्थानीय समयक्षेत्र को एक समय-क्षेत्र पर सेट करें, जिसमें अतीत में एक अलग UTC ऑफसेट था (जैसे यूरोप / मास्को), अतीत से टाइमस्टैम्प के साथ fromtimimamp () कॉल करें। (2011)। उपयोग करके गणना किए गए मूल्यों के साथ परिणामों की तुलना करें pytz। यदि यह अस्पष्ट है; एक अलग स्टैक ओवरफ्लो प्रश्न पूछें।
जेएफ


6
एक आयात बिंदु यह सेकंड के बाद से सेकंड में टाइमस्टैम्प लेता है; यदि आपके पास मिलीसेकंड है तो आपको 1000 से भाग देना होगा जैसा कि मुझे अभी पता चला है।
शब्दफिरवाइज


145

सबसे अधिक वोट किए गए जवाब से पता चलता है कि यह स्थानीय समय क्षेत्र का उपयोग करने के बाद से त्रुटि प्रवणता है। मुद्दों से बचने के लिए UTC का उपयोग करना बेहतर तरीका है:

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

जहां posix_time पॉज़िक्स युग है, जिसे आप परिवर्तित करना चाहते हैं


2
आयात डेटाइम, pytz डेटाइम.डाइमटाइम (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()अतीत दिनांकों असफल हो सकता है अगर एक स्थानीय समय क्षेत्र अलग यूटीसी ऑफसेट था। आपको एक ऐतिहासिक टाइमज़ोन डेटाबेस की आवश्यकता है जैसे कि pytzमॉड्यूल (या आपके ओएस) द्वारा प्रदान किया गया है । या सिर्फ यूटीसी में काम करें और उपयोग करें time.gmtime()datetimeव्यापक तिथि सीमा प्रदान datetime.utcfromtimestamp()कर सकता है ताकि timeकार्यों के बजाय इसका उपयोग किया जा सके ।
1

66

इसके दो भाग हैं:

  1. स्थानीय समय में यूनिक्स टाइमस्टैम्प ("सेकंड के बाद से") में कनवर्ट करें
  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_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"))

पायथन 3 पर, आप केवल stdlib (UTC ऑफसेट का उपयोग गलत हो सकता है अगर अजगर आपके सिस्टम पर tz डेटाबेस तक पहुँच नहीं है, उदाहरण के लिए, विंडोज पर), एक टाइमज़ोन-अवगत डेटाटाइम प्राप्त कर सकता है:

#!/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))  

यदि आप स्थानीय समय की परवाह करते हैं तो यह सबसे अधिक मतदान का जवाब होना चाहिए।
अज़मसा

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

का उपयोग कर के अलावा समय / दिनांक पैकेज, पांडा भी हल करने के लिए एक ही problem.Here हम कैसे उपयोग कर सकते हैं इस्तेमाल किया जा सकता पांडा परिवर्तित करने के लिए टाइमस्टैम्प करने के लिए पठनीय तारीख :

टाइमस्टैम्प दो स्वरूपों में हो सकते हैं:

  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'

पांडा के लिए एक और जीत ऐसा लगता है - मॉड्यूल सब कुछ पर शानदार है
Vaidotas Ivøška

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

टाइमस्टैम्प से समय के साथ पठनीय तारीख भी प्राप्त करें, साथ ही आप तारीख के प्रारूप को बदल सकते हैं।


5
क्या इस उत्तर के लिए जोड़ है इस सवाल का जवाब?
कोकिका

1
कृपया स्थानीय टाइमज़ोन धारणा के मुद्दे से संबंधित एक चेतावनी जोड़ें। प्रोग्रामिंग में सबसे अच्छा अभ्यास टाइमस्टैम्प को स्थानीय टाइमस्टैम्प के बजाय यूटीसी समय के रूप में संग्रहीत करना है। लेकिन ऊपर दिया गया यह उदाहरण गलत समय लौटाएगा यदि स्थानीय टाइमज़ोन यूटीसी नहीं है।
टिमोथी सी। क्विन

20

पायथन में 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
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp

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]))
जेले ज़िलस्ट्रा

2
@ जेलेज़िज्स्ट्रा एह, मैं मानचित्र पर जनरेटर की अभिव्यक्ति को बहुत पसंद करता हूं।
crhodes

4
-5 2013-5-5-1-9-43 ’किस प्रकार का दिनांक स्वरूप है? मैंने इस प्रारूप को कभी भी किसी तिथि / समय के वैध प्रतिनिधित्व के रूप में नहीं देखा है।
मडोकी

क्या आप इस बारे में विस्तृत रूप से बता सकते हैं कि यह अवैध प्रतिनिधित्व @madoki के रूप में क्या है? क्या आपका मतलब गैरमानक है? अधिकांश अन्य उत्तरों में इसका प्राथमिक लाभ यह है कि इसे फ़ाइल या निर्देशिका पथ में शामिल करने की क्षमता है, क्योंकि रिक्त स्थान और कॉलोन मानक यूनिक्स निर्देशिका वर्णों के सेट में नहीं हैं। उदाहरण के लिए देखें 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
हर प्रोग्रामिंग की अपनी तिथि और समय कन्वर्टर्स होता है। इसके लिए कभी भी मॉड / फ्रेमवर्क का उपयोग नहीं करना चाहिए
जोसफ्रे

strptimeऔर strftimeसहज नहीं है ... और यहां तक ​​कि पठनीय नहीं है ... लेकिन मैं समझता हूं और आपकी राय का सम्मान करता हूं
राफेल अमेडो

4
यह कि "कभी भी उपयोग नहीं करना चाहिए" गलत है। यह भाषा और अंतर्निहित कामों की गुणवत्ता पर निर्भर करता है। जावास्क्रिप्ट में क्षण होते हैं। जेएस और जावा में जोडा का समय होता है जो दोनों संबंधित अंतर्निहित तिथि और समय रूपांतरण के बर्तनों की तुलना में अधिक लोकप्रिय हैं (इतना ही नहीं कि बाद में जोडा ने जावा 8 के अद्यतन मानक कामों को प्रभावित किया)। जब तक कि यह सवाल अच्छे तृतीय-पक्ष पुस्तकालयों के लिए नहीं कहा जाता है, तब तक मानक पुस्तकालय के आधार पर उत्तर देना बेहतर होता है।
हज्जाजमन

मैं @NikosVentouras सही खड़ा हूं। मैं सिर्फ पहली बार IE में "जेएस दिनांक अलग व्यवहार करता है" मुद्दा था। इसलिए मैंने क्षण भर में समाप्त कर दिया। जेएस
जोसफ्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.