স্ট্রাইফটাইমের সাথে অজগরের ডেটটাইমকে রূপান্তর করুন


209

আমার ইউটিসিতে একটি সময় রয়েছে যা থেকে আমি যুগের পর থেকে সেকেন্ডের সংখ্যাটি চাই।

আমি এটিকে সেকেন্ডের সংখ্যায় রূপান্তর করতে স্ট্রফটাইম ব্যবহার করছি। উদাহরণস্বরূপ 1 এপ্রিল 2012 গ্রহণ করা।

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

১ লা এপ্রিল ২০১২ ইউটিসি থেকে মহাকাশটি 1333238400 তবে এটি উপরে 1333234800 দেয় যা 1 ঘন্টা দ্বারা পৃথক।

সুতরাং দেখে মনে হচ্ছে যে স্ট্রফটাইম আমার সিস্টেমের সময়টিকে অ্যাকাউন্টে নিচ্ছে এবং কোথাও একটি সময় অঞ্চল শিফট প্রয়োগ করে। আমি ভেবেছিলাম ডেটটাইম খাঁটি নিষ্পাপ ছিল?

আমি কিভাবে এটি কাছাকাছি পেতে পারি? যদি সম্ভব হয় তবে স্ট্যান্ডার্ড না হলে অন্যান্য লাইব্রেরি আমদানি করা এড়ানো। (আমার বহনযোগ্যতা নিয়ে উদ্বেগ রয়েছে)।


সম্পর্কিত:
ডেটটাইম.ডেটকে

11
আমি কি কেবলমাত্র লক্ষ করছি যে আপনি সংখ্যায় অক্টাল আক্ষরিক ব্যবহার করেন?
ফিশ মনিটর


3
নতুন পাইথন ৩.৩++ রয়েছেdatetime.datetime.timestamp(datetime.datetime.utcnow())
মার্কহু

উত্তর:


389

আপনি যদি যুগে যুগে একটি অজগর ডেটটাইমটিকে সেকেন্ডে রূপান্তর করতে চান তবে আপনি এটি স্পষ্টভাবে করতে পারেন:

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

পাইথন ৩.৩+ তে আপনি timestamp()পরিবর্তে ব্যবহার করতে পারেন :

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0

কেন আপনার ব্যবহার করা উচিত নয় datetime.strftime('%s')

পাইথন আসলে% s কে স্ট্রাইফটাইমের আর্গুমেন্ট হিসাবে সমর্থন করে না (আপনি যদি এই তালিকায় নেই তবে http://docs.python.org/library/datetime.html#strftime-and-strptime-behaviar এ পরীক্ষা করুন ) এটি কাজ করার কারণটি কারণ পাইথন আপনার সিস্টেমের স্ট্রফটাইমে তথ্য প্রেরণ করছে যা আপনার স্থানীয় সময় অঞ্চল ব্যবহার করে।

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

7
আমি কেন স্ট্রফটাইম ("% s") অনেক দেখি তা বোঝার চেষ্টা করতে গিয়ে পাগল হয়ে যাচ্ছি, তবে এটি ডক্সে নেই। এই কিছুই করার জন্য আপনাকে ধন্যবাদ!
জোনাথন ভানাস্কো

54
ব্যবহার করবেন না .strftime("%s"): এটি সমর্থিত নয়, এটি পোর্টেবল নয়, সচেতন তারিখের অবজেক্টের জন্য এটি নিঃশব্দে একটি ভুল ফলাফল তৈরি করতে পারে, ইনপুটটি ইউটিসি-তে থাকলে (ব্যর্থ হওয়া হিসাবে) ব্যর্থ হয় তবে স্থানীয় সময়
অঞ্চলটি

2
@earthmeLon আপনার বন্ধনী ভুল। টাইমডেল্টাসে (দুটি তারিখের সময় বিয়োগ করে তৈরি করা হয়েছে) মোট_ সেকেন্ড রয়েছে, তবে তারিখের সময়গুলি নেই।
jleahy

2
এটি আমার পক্ষে কাজ করছে না:AttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
মাইকেল

3
@ মিশেল সেই ফাংশনটি পাইথন ২.7 এ নতুন, আপনার অবশ্যই একটি পুরানো সংস্করণ ব্যবহার করা উচিত। ২.7 এর আগে সংস্করণগুলির জন্য আপনি এটি করতে পারেন td.seconds + td.days*24*3600। এটি মাইক্রোসেকেন্ডের অংশটি বাদ দেয়।
jleahy

100

টাইমজোনস এবং এর সাথে আমার গুরুতর সমস্যা ছিল। পাইথন যেভাবে সমস্ত কিছু পরিচালনা করে তা (আমার কাছে) বেশ বিভ্রান্তিকর হতে পারে। জিনিসগুলি ক্যালেন্ডার মডিউলটি ব্যবহার করে দুর্দান্ত কাজ করছে বলে মনে হচ্ছে (লিঙ্কগুলি 1 , 2 , 3 এবং 4 দেখুন )।

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400

7
+1 কারণ এটিই কেবলমাত্র উত্তর যা প্রশ্নের ইনপুটটির জন্য কাজ করে।
jfs

এই বহনযোগ্য?
বেনজামিনজ

1
এটি যথাযথ উত্তর হিসাবে চিহ্নিত করা উচিত, যেহেতু এটি প্রশ্নের উদ্বেগের উত্তর দেয়। vnice kudos
লিও প্রিন্স

2
এটি 'কাজ করে', তবে উল্লিখিত প্রশ্নটি নোট করুন: "ইউটিসিতে আমার একটি সময় আছে" এই পদ্ধতিটি সর্বদা সিস্টেমের স্থানীয় সময় অঞ্চল ব্যবহার করবে। টাইমজোন নির্দিষ্ট করার কোনও উপায় নেই। যদি aprilFirstএই উদাহরণে কোনও 'সচেতন' উদাহরণ এবং সিস্টেমের টাইমজোন থেকে আলাদা সময় অঞ্চল ব্যবহার করা হয়, ফলাফলটি সঠিক হবে না ( timetuple()কলটিতে টাইমজোনটি হারিয়ে যায় )। একটি 'সচেতন' ডেটটাইমের সঠিক উত্তর পেতে আপনি awaredt.timestamp()সাম্প্রতিক পাইথন 3 ব্যবহার করতে পারেন Py পাইথন 2 এর পক্ষে এটি আরও শক্ত; একটি উপায় arrowলাইব্রেরি ব্যবহার করা হয় । arrow.get(awaredt).timestampএটা ঠিক পেতে হবে।
অ্যাডাম উইলিয়ামসন

1
গুড পয়েন্ট, @ অ্যাডাম উইলিয়ামসন, তবে উদাহরণের কোডটি datetimeঅবজেক্টটিকে স্থানীয়করণ করছে না , তাই আমি ধরে নিয়েছি যে "ইউটিসিতে আমার একটি সময় রয়েছে" এর অর্থ ওপিটির একটি অজানা datetimeবিষয় ছিল যা ধরে নেওয়া হয়েছিল যে এটি ইউটিসি-তে আছে যার জন্য তিনি চেয়েছিলেন একটি পেতে epoch(যদি datetimeটিজেড-সচেতন হওয়ার ঘটনাটি ঘটে তবে এটি সম্ভবত বাস্তবে পরিবর্তন করতে পারে)। এছাড়াও, মনে রাখবেন যে এই উত্তরটি প্রায় 8 বছরের পুরানো এবং এর পরে অনেক কিছু ঘটেছে ( arrowউদাহরণস্বরূপ, ২০১৩ সালে প্রকাশিত হয়েছিল)
বোরারাজএক্স

35
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())

1
এটি লেখার একটি ভুল উপায় time.time()( কাজ চালিয়ে যাওয়ার mktime()সময়ে ডিএসটি রূপান্তরের সময় ব্যর্থ হতে পারে time.time())। স্থানীয় সময় অঞ্চলটি ইউটিসি না হওয়া পর্যন্ত এটি প্রশ্নের উত্তর দেয় না (প্রশ্নের ইনপুটটি ইউটিসিতে থাকে)। এমনকি যদি ইনপুটটি কোনও স্থানীয় সময়কে উপস্থাপন করে তবে mktime()অতীতে / ভবিষ্যতের তারিখগুলি ব্যর্থও হতে পারে যদি এতে টিজেড ডাটাবেস ব্যবহার না করা হয় এবং যদি স্থানীয় সময় অঞ্চলটিতে বছরের পর বছর ধরে ইউরোপ / মস্কো বিভিন্ন ইউএসসি অফসেট থাকতে পারে - - পরিবর্তে ইউটিসি সময় (প্রশ্ন হিসাবে) বা সময় অঞ্চল-সচেতন ডেটটাইম অবজেক্টগুলি ব্যবহার করুন।
jfs

একটি স্থানীয় সময়কে রূপান্তরিত করে এখানে আরও সমস্যা রয়েছে (যেমন প্রত্যাবর্তন করা হয়েছে .now()) সময়কেmktime() স্টেপ স্ট্যামে রূপান্তরিত করে (ফিরে এসেছে ) । আপনি যদি এটি পড়েন; আপনি বুঝতে পেরেছেন কেন ইউটিসি ইনপুট (প্রশ্নে ব্যবহৃত) স্থানীয় সময়কে উপস্থাপন করার মতো একটি
নির্লজ্জ ডেটটাইম

14
import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(দুঃখিত, এটি আমার বিদ্যমান উত্তর সম্পর্কে মন্তব্য করতে দেয় না)


এটি কারণ সময়.মেকটাইম মাইক্রোসেকেন্ড অংশ বিবেচনা করে না, তাই না?
এডুয়ার্ডো

1
সঠিক। টাইম টুপল স্ট্রাক্ট (সি স্ট্র্টের উপর ভিত্তি করে) মাইক্রোসেকেন্ডগুলির জন্য কোনও স্থান নেই, সুতরাং আমাদের ডেটটাইম অবজেক্ট থেকে তথ্যটি গ্রহণ করতে হবে এবং শেষে এটি যুক্ত করতে হবে।
চার্লস প্লাগার


আমার মেশিনে, এটি আমার সময় অঞ্চলটি ইটি হলেও সঠিকভাবে কাজ করে।
চার্লস প্লাগার

1
এটি আপনাকে সিস্টেমের স্থানীয় সময় ভিত্তিক বিভিন্ন সিস্টেমে বিভিন্ন টাইমস্ট্যাম্প দেবে।
ইউসুফ

6

আপনার যদি কেবল ইউনিক্স / যুগের সময়কালের জন্য স্ট্যাম্প স্ট্যাম্পের প্রয়োজন হয় তবে এই একটি লাইন কাজ করে:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

এবং কেবল datetime পাইথন 2 এবং পাইথন 3 এর কাজগুলিতে নির্ভর করে


2

এটি পাইথন 2 এবং 3 তে কাজ করে:

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

শুধু সরকারী ডক্স নিম্নলিখিত ... https://docs.python.org/2/library/time.html#module-time


1) এটি ধরে নিয়েছে যে আপনি এখন রূপান্তর করতে চান, এলোমেলো ডেটটাইম অবজেক্ট নয়। 2) আপনার ক্যালেন্ডার দরকার নেই। সময়.মেকটাইম (এলোমেলো ডেটটাইম.টাইমটাইপল ()) + এলোমেলো ডেটটাইম.মাইক্রোসেকেন্ড * 1 ই -6
চার্লস প্লাগার

@ চার্লসপ্ল্যাজার সময়.মেকটাইম ভুল; এটি স্থানীয় সময় অঞ্চলে যুক্তির ব্যাখ্যা দেয়, যেখানে ওপি ইউটিসি-তে ব্যাখ্যা করা সময় চায় (যেমন ক্যালেন্ডার.টাইমএমএস করে)।
স্টুবাসিক

এটি আমার কাছে সবচেয়ে সঠিক উত্তর, যদি আপনি GMT এ আপনার সময়কে রূপান্তর করতে চান এবং আপনি এটি সেই সময়টিকে রূপান্তরকে টাইমস্ট্যাম্পে রূপান্তর করতে চান।
ইউসুফ

ঠিক আপনার উত্তর অনুসরণ করে, ক্যালেন্ডার.টাইমজি (ডেটটাইম.স্ট্রিপটাইম ("2019-05-03T05: 40: 09.770494 + 00: 00" [: 16], '% Y-% m-% dT% H:% M')। টাইমটুপল ()) আমার ইউটিসি তে টাইমস্ট্যাম্প রয়েছে এবং আপনি যে সিস্টেমটি চালাচ্ছেন তা আমাকে সঠিক টাইমস্ট্যাম্প দেয় না কেন, ট্রিকটাইমটি টাইপটাইমটাইমটাইমটাম্পল
ইউসুফ

2

সুস্পষ্ট টাইমজোন-স্বতন্ত্র সমাধানের জন্য পাইটজ লাইব্রেরিটি ব্যবহার করুন।

import datetime
import pytz

pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

আউটপুট (ভাসা): 1333238400.0


একই ধরণের প্রস্তাব উত্তর দেখেছি stackoverflow.com/a/21145908/4355695 , কিন্তু ইনকামিং তথ্য ইউটিসি হয় এবং মাত্র .timestamp এক মাছ ধরার নৌকা হিসাবে এই এক আমার ব্যবহারের ক্ষেত্রে জন্য মহান () এটা অভিমানী ছিল স্থানীয় সময় হতে ।
নিখিল ভিজে

এটি 1970 এর চেয়ে কম তারিখের জন্য কাজ করে। আপনাকে ধন্যবাদ। গৃহীত উত্তর 1970 এর চেয়ে কম তারিখের জন্য কাজ করে না। (পাইথন 3.7.3 64৪-বিট অ্যানাকোন্ডা 3)
ক্যানব্যাক্স

-1

পাইথনে ৩. 3.

তারিখ.আইসোফোর্ম্যাট () এবং ডেটটাইম.আইসোফোর্ম্যাট () দ্বারা নির্ধারিত ফর্ম্যাটগুলির একটিতে একটি তারিখ_সংকেত সম্পর্কিত একটি ডেটটাইম ফেরান। বিশেষত, এই ফাংশনটি ওয়াইওয়াইওয়াই-এমএম-ডিডি [* এইচএইচ [] এমএম [: এসএস [.এফএফএফ [এফএফএফ]]]] [+ এইচএইচ: এমএম [: এসএস [.এফএফএফএফফ]]]] বিন্যাসে স্ট্রিংগুলিকে সমর্থন করে , যেখানে * যে কোনও একক অক্ষরের সাথে মেলে।

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat


1
জেনে থাকুন যে এটি পাইথন ৩.7 এ প্রবর্তিত হয়েছিল।
কিথপজল্লি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.