আমার কাছে পাইথন datetime
অবজেক্ট রয়েছে যা আমি ইউনিক্স সময়, বা সেকেন্ড / মিলিসেকেন্ডগুলিতে রূপান্তর করতে চাই 1970 সাল থেকে।
আমি এটা কিভাবে করবো?
$ python -c 'import time; print(time.time())'
1584487455.698623
আমার কাছে পাইথন datetime
অবজেক্ট রয়েছে যা আমি ইউনিক্স সময়, বা সেকেন্ড / মিলিসেকেন্ডগুলিতে রূপান্তর করতে চাই 1970 সাল থেকে।
আমি এটা কিভাবে করবো?
$ python -c 'import time; print(time.time())'
1584487455.698623
উত্তর:
এটি করার সহজ উপায়টি আমার কাছে উপস্থিত হয়
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
ওএস নির্ভর! এভাবে কোডটি যেকোন যা অপারেটিং সিস্টেম, কখনও ব্যবহার করা উচিত উপর নির্বিশেষে নির্ভরযোগ্যভাবে কাজ চান %s
। ২.৩ <পিয়ার ভার্ <২. 2. এর জন্য। যে কোনও এটি সহজেই এটি তৈরি করতে পারে total_seconds()
:delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
অবশ্যই ইউটিসি-তে থাকতে হবে (স্থানীয় নয়) পাইথন ২.6 / 3 সমর্থন সহ একই উত্তর
utcfromtimestamp(0)
একটি 'TZ' অফসেট শুধুমাত্র যদি 'TZ' হতে পারে 0. নয় কারণ dt
এর মধ্যে dt- epoch
আছে 'TZ' এটা হিসাব করা যেখানে যুগান্তকারী যেমন ইউটিসি সময়। যুগের গণনার সর্বোত্তম উপায় হ'ল epoch = datetime.datetime(1970, 1, 1)
টাইমজোন বিবেচনা করা।
datetime.utcfromtimestamp(0)
tzinfo ছাড়াই একটি ডেটটাইম ফেরায়? এটি ঠিক সেখানে পদ্ধতির নাম, utc থেকে স্টাইমস্ট্যাম্প। এটিকে নির্দোষ বানানোর জন্য আমাকে এরকম কিছু করতে হবে datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
। dt
টাইমজোন সচেতন হলে এটি প্রয়োজনীয় বা অন্যথায় আপনি পাবেনTypeError: can't subtract offset-naive and offset-aware datetimes
পাইথন ৩.৩-তে নতুন পদ্ধতি যুক্ত হয়েছে timestamp
:
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
আপনার প্রশ্নে উল্লেখ করা হয়েছে যে আপনার মিলি সেকেন্ডের দরকার ছিল যা আপনি এটির মতো পেতে পারেন:
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
আপনি যদি timestamp
কোনও নিষ্পাপ ডেটটাইম অবজেক্টে ব্যবহার করেন, তবে ধরে নেওয়া হবে যে এটি স্থানীয় সময় অঞ্চলে রয়েছে। আপনি যদি যা করতে চান তা যদি এটি না হয় তবে সময় অঞ্চল-সচেতন তারিখের সময় অবজেক্টগুলি ব্যবহার করুন।
.timestamp()
পদ্ধতিটি ধরে নিয়েছে যে একটি নির্লজ্জ ইনপুট ডেটটাইম স্থানীয় সময় অঞ্চলে (এবং স্থানীয় সময়টি দ্ব্যর্থক হতে পারে)। এটি যদি ইউটিসিতে থাকে তবে dt.replace(tzinfo=timezone.utc).timestamp()
পরিবর্তে ব্যবহার করুন ।
datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
তবে (সর্বদা) সমান নয় ( datetime.datetime.now().timestamp()
স্থানীয় টিজেটিটিসি যদি ইউটিসি হয় তবে এই সর্বশেষটি কেবলমাত্র বাকিদের সমান))
fromtimestamp
( docs.python.org/3/library/... )
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000
1312908481000
অথবা সময় মডিউলটির সহায়তা (এবং তারিখ বিন্যাস ছাড়াই):
>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0
থেকে সহায়তার সাথে উত্তর দেওয়া হয়েছে: http://pleac.sourceforge.net/pleac_python/datesandtimes.html
ডকুমেন্টেশন:
.timetuple()
আয় tm_isdst=-1
এটা জোর mktime()
অনুমান করা। এটি ডিএসটি চলাকালীন ভুল অনুমান করতে পারে (একটি ত্রুটির +২-৪০% সম্ভাবনা)। '% S' উভয়ই mktime()
অতীত তারিখগুলির জন্য ভুল ইউটিসি অফসেট ব্যবহার করতে পারে। আপনার একটি pytz
time.mktime(ts.timetuple())
যেখানে
mktime/timetuple
। এছাড়াও timetuple()
একটি সেকেন্ডের ভগ্নাংশগুলি স্ট্রিপ করে এবং প্রশ্নের বিন্দুটি হ'ল মিলিসেকেন্ড যথার্থতার সাথে টাইমস্ট্যাম্প পাওয়া।
আপনি স্থান এবং সময় ভ্রমণের জন্য ডেলোরিয়ান ব্যবহার করতে পারেন!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
আমি এটি এইভাবে করি:
from datetime import datetime
from time import mktime
dt = datetime.now()
sec_since_epoch = mktime(dt.timetuple()) + dt.microsecond/1000000.0
millis_since_epoch = sec_since_epoch * 1000
মডিউলটির জন্য পাইথন ২.7 ডক্সের প্রস্তাবনাtime
time
মডিউলটি ব্যবহার করে তবে ওপি datetime
মডিউল সম্পর্কে জিজ্ঞাসা করেছিল । এফডব্লিউআইডাব্লু, সহজতম যুগের int(time.time())
from datetime import datetime
from calendar import timegm
# Note: if you pass in a naive dttm object it's assumed to already be in UTC
def unix_time(dttm=None):
if dttm is None:
dttm = datetime.utcnow()
return timegm(dttm.utctimetuple())
print "Unix time now: %d" % unix_time()
print "Unix timestamp from an existing dttm: %d" % unix_time(datetime(2014, 12, 30, 12, 0))
timegm()
শুধুমাত্র পুরো সময়ের সাথে কাজ করে। এটি ব্যবহার করে না tm_isdst
সুতরাং আপনি utcnow.timetuple()
পরিবর্তে ব্যবহার করতে পারেন utcnow.utctimetuple()
। দ্রষ্টব্য: naive_local_datetime.utctimetuple()
এখানে ব্যবহার করা ভুল হবে। এটি স্থানীয় সময়টিকে ইউটিসি তে অনুবাদ করে না। এছাড়াও timetuple()
রেখাচিত্রমালা ফলাফল থেকে এক সেকেন্ডের ভগ্নাংশ কল (কিনা এটা গুরুত্বপূর্ণ আবেদন উপর নির্ভর করে)। এছাড়াও প্রশ্নটি * মিলি * সেকেন্ড সম্পর্কে জিজ্ঞাসা করে, সেকেন্ড নয়
utctimetuple()
একটি সেকেন্ডের স্ট্রিপস ভগ্নাংশ। গুন করে 1000
এগুলি ফিরে পাবেন না।
>>> import datetime
>>> import time
>>> import calendar
>>> #your datetime object
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 3, 19, 13, 0, 9, 351812)
>>> #use datetime module's timetuple method to get a `time.struct_time` object.[1]
>>> tt = datetime.datetime.timetuple(now)
>>> tt
time.struct_time(tm_year=2013, tm_mon=3, tm_mday=19, tm_hour=13, tm_min=0, tm_sec=9, tm_wday=1, tm_yday=78, tm_isdst=-1)
>>> #If your datetime object is in utc you do this way. [2](see the first table on docs)
>>> sec_epoch_utc = calendar.timegm(tt) * 1000
>>> sec_epoch_utc
1363698009
>>> #If your datetime object is in local timeformat you do this way
>>> sec_epoch_loc = time.mktime(tt) * 1000
>>> sec_epoch_loc
1363678209.0
[1] http://docs.python.org/2/library/datetime.html#datetime.date.timetuple
আপনার সময়ের অবজেক্টের সাধারণকরণের সাথে সমাধানের আরও একটি রূপ এখানে রয়েছে:
def to_unix_time(timestamp):
epoch = datetime.datetime.utcfromtimestamp(0) # start of epoch time
my_time = datetime.datetime.strptime(timestamp, "%Y/%m/%d %H:%M:%S.%f") # plugin your time object
delta = my_time - epoch
return delta.total_seconds() * 1000.0
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000
* 1000
, যদিও, আপনি পাবেন seconds_since_epoch
। এই উত্তরটি সমর্থন করা কারণ আমি এই মুহুর্তে মিলিসেকেন্ডগুলির বিষয়ে চিন্তা করি না।
উপরের উত্তরের ভিত্তিতে আমি এখানে একটি ফাংশন তৈরি করেছি
def getDateToEpoch(myDateTime):
res = (datetime.datetime(myDateTime.year,myDateTime.month,myDateTime.day,myDateTime.hour,myDateTime.minute,myDateTime.second) - datetime.datetime(1970,1,1)).total_seconds()
return res
আপনি ফিরে আসা মানটি এ জাতীয়ভাবে মোড়াতে পারেন: str (int (res)) দশমিক মান ব্যতীত স্ট্রিং হিসাবে ব্যবহার করতে হবে বা কেবল ইনট (str না করে) ব্যবহার করতে হবে
গোপন তারিখের জন্য ইউনিক্সটাইম স্ট্যাম্পিলিসের জন্য এই অন্যান্য সমাধান।
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long GetCurrentUnixTimestampMillis()
{
DateTime localDateTime, univDateTime;
localDateTime = DateTime.Now;
univDateTime = localDateTime.ToUniversalTime();
return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
}