আপনি কীভাবে একটি টাইম.স্ট্রিক্ট_টাইম অবজেক্টকে ডেটটাইম অবজেক্টে রূপান্তর করবেন?


288

আপনি কীভাবে পাইথন time.struct_timeঅবজেক্টকে কোনও datetime.datetimeঅবজেক্টে রূপান্তর করবেন ?

আমার কাছে একটি লাইব্রেরি রয়েছে যা প্রথমটি এবং দ্বিতীয় লাইব্রেরি সরবরাহ করে যা দ্বিতীয়টি চায়।

উত্তর:


384

ব্যবহারের time.mktime () পর্ব থেকে সেকেন্ড মধ্যে সময় tuple (স্থানীয়সময় মধ্যে) রূপান্তর, তারপর ব্যবহার করতে ) datetime.fromtimestamp ( DATETIME বস্তুর জন্য।

from datetime import datetime
from time import mktime

dt = datetime.fromtimestamp(mktime(struct))

45
মনে রাখবেন যে এটি 1900 এর আগে ব্যর্থ হয় You আপনি আধুনিক মানুষ কখনও এই সীমাবদ্ধতা মনে রাখবেন না!
mlissner

3
এটি কি tm_isdstডেটা হারাবে ? আমি তাই মনে করি, DATETIME বস্তুর ফলে ফিরে যাওয়ার পরিমাণে সাদাসিধা অবশেষ Noneউপর .dst()এমনকি যদি struct.tm_isdstহয় 1
n611x007

3
এটি সাধারণত কাজ করবে। তবে সময় ব্যতিরেকে এমকেটাইম স্বীকৃত মানগুলির বাইরে থাকলে এটি ব্যর্থ হবে, উদাহরণস্বরূপ মানটির জন্য (1970, 1, 1, 0, 0, 0, 0, 1, -1)। আমি এইচটিটিপি অনুরোধে ডেট শিরোনাম বিশ্লেষণের পরে এর মুখোমুখি হয়েছি যা এই টিপলটি ফিরিয়ে দিয়েছে।
ব্যবহারকারী 3820547

3
@ রিচভিডিএফ: সি স্ট্যান্ডার্ড নির্দিষ্ট করে যা অ্যাকাউন্টে mktime()নেওয়া উচিত tm_isdstএবং পাইথন সিথ ফাংশন time.mktime()কল mktime()করে on mktime()ভুল স্থানীয় সময় চয়ন করতে পারেন যখন এটি দ্ব্যর্থক (যেমন, শেষ অফ ডিএসটি সময় ( "ফিরে পড়া") রূপান্তরটি) যদি struct.tm_isdstহয় -1অথবা যদি mktime()দেওয়া প্ল্যাটফর্মে উপেক্ষা করে ইনপুট tm_isdst । এছাড়াও, যদি স্থানীয় সময় অঞ্চলে অতীতে আলাদা আলাদা ইউএসসি অফসেট থাকে এবং সি mktime()কোনও historicalতিহাসিক tz ডাটাবেস ব্যবহার না করে যা পুরানো ইউটিসি অফসেট মান সরবরাহ mktime()করতে পারে তবে কোনও ভুল (উদাহরণস্বরূপ, এক ঘন্টা দ্বারা) মানও ফিরে আসতে পারে।
jfs

1
@ ন্যাক্সা: যদি প্রদত্ত প্ল্যাটফর্মটি mktime()উপেক্ষা না করে tm_isdst(এটি আমার উপর দিয়ে থাকে) তবে fromtimestamp()অবশ্যই তথ্যটি হারিয়ে ফেলবে: স্থানীয় সময় উপস্থাপন করে ফিরে আসা নিষ্পাপ datetime বস্তু দ্ব্যর্থক হতে পারে (টাইমস্ট্যাম্প -> স্থানীয় সময়টি নির্ধারিত (যদি আমরা লিপ সেকেন্ড উপেক্ষা করি) তবে local time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also, থেকে টাইমস্ট্যাম্প () it যদি এটি কোনও historical
তিহাসিক

123

এটার মত:

>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)

3
# গুরুত্বপূর্ণ সময়,
তারিখের

7
@ জুইভিস্ট - কিছু জিনিস লোকেরা নিজেরাই তা নির্ধারণ করতে বিশ্বাসী হতে পারে :)
ওরিপ

14
@ *এন্ড **সিনট্যাক্স পুনরায় যোগ করা আপনাকে পৃথক যুক্তিগুলিতে একটি তালিকা বা দ্বৈত প্রকারের বস্তুটি প্রসারিত করতে দেয় - এটি পাইথনের প্রেমের আমার প্রিয় অংশগুলির মধ্যে একটি। আরও তথ্যের জন্য ডকস.পিথন.আর. / ২ / টিউটোরিয়াল/… দেখুন
জৈবপান্ডা

10
কেবল মনে রাখবেন যে যদি স্ট্রাক্টটাইমটিতে লিপসেকেন্ড থাকে তবে উদাহরণস্বরূপ:t=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
বার্ডারিও

7
@ বার্ডারিও: সাথে মানসমূহের সাথে সামঞ্জস্যতা ফিরিয়ে আনতে datetime: datetime(*t[:5]+(min(t[5], 59),))যেমন, গ্রহণ করা "2015-06-30 16:59:60 PDT"
jfs

37

এটি আপনার প্রশ্নের সরাসরি উত্তর নয় (যা ইতিমধ্যে বেশ ভাল উত্তর দেওয়া হয়েছিল)। যাইহোক, বার বার আমাকে মৌলিক ভিত্তিতে বেশ কয়েকবার দংশন করার পরেও আমি এতটা চাপ দিতে পারি না যে আপনার সময়. স্ট্রাক্ট_টাইম অবজেক্টটি কী সরবরাহ করছে, বনাম, অন্যান্য সময় ক্ষেত্রগুলির কী থাকতে পারে তা ঘনিষ্ঠভাবে দেখার জন্য আপনাকে মনোনিবেশ করা উচিত।

ধরে নিই যে আপনার সময়, স্ট্রাক্ট_টাইম অবজেক্ট এবং অন্য কোনও তারিখ / সময় স্ট্রিং উভয় রয়েছে, দুটির তুলনা করুন এবং নিশ্চিত হন যে আপনি ডেটা হারাচ্ছেন না এবং অজান্তে একটি নিষ্পাপ ডেটটাইম অবজেক্ট তৈরি করছেন, যখন আপনি অন্যথায় করতে পারেন।

উদাহরণস্বরূপ, দুর্দান্ত ফিডপার্সার মডিউলটি একটি "প্রকাশিত" ক্ষেত্রটি ফিরিয়ে দেবে এবং সময় "স্ট্রাক্ট_টাইম" তার "প্রকাশিত_প্রেসড" ফিল্ডে ফিরে আসতে পারে:

time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)

এখন আপনি "প্রকাশিত" ক্ষেত্রের সাথে আসলে কী পাবেন তা লক্ষ্য করুন।

Mon, 09 Sep 2013 19:57:42 -0400

দ্বারা স্টলম্যান এর দাড়ি! টাইমজোন তথ্য!

এই ক্ষেত্রে, অলস লোকটি সময় অঞ্চলটির তথ্য রাখার জন্য দুর্দান্ত তারিখের মডিউলটি ব্যবহার করতে চাইতে পারে:

from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()

যা আমাদের দেয়:

published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00

তারপরে কেউ ইউটিসিতে বা আপনি যা দুর্দান্ত মনে করেন তা সর্বকালের স্বাভাবিক করার জন্য টাইমজোন-সচেতন ডেটটাইম অবজেক্টটি ব্যবহার করতে পারে।


7
*_parsedফিডপার্সড থেকে সমস্ত ক্ষেত্রগুলি ইতিমধ্যে ইউটিসি-তে স্বাভাবিক করা হয়েছে যেহেতু তারিখ বিশ্লেষণের ডকুমেন্টেশনে যাচাই করা যেতে পারে তাই এটি অনর্থক।
itorres

1
@ অ্যাট্রেস: যদি আমি এটি বুঝতে পারি তবে এই উত্তরটি ইউটিসি-তে স্বাভাবিককরণের বিষয়ে নয়, তবে কোনও datetimeবস্তুতে টাইমজোন তথ্য রাখার বিষয়ে যা feedparserকাঁচা স্ট্রিংয়ের তারিখগুলি পার্স করার সময় হারিয়ে যায় ।
ডেভিডাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.