পাইথনের যুগে যুগে (ইউনিক্স সময়) সাল থেকে ডেটটাইম অবজেক্টটিকে মিলিসেকেন্ডে কীভাবে রূপান্তর করতে পারি?


353

আমার কাছে পাইথন datetimeঅবজেক্ট রয়েছে যা আমি ইউনিক্স সময়, বা সেকেন্ড / মিলিসেকেন্ডগুলিতে রূপান্তর করতে চাই 1970 সাল থেকে।

আমি এটা কিভাবে করবো?


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

আপনি যদি মিলিসেকেন্ড $ python -c 'import time; print(time.time())'1584487455.698623
যথাযথতার

উত্তর:


471

এটি করার সহজ উপায়টি আমার কাছে উপস্থিত হয়

import datetime

epoch = datetime.datetime.utcfromtimestamp(0)

def unix_time_millis(dt):
    return (dt - epoch).total_seconds() * 1000.0

32
এখন পর্যন্ত এটি সেরা সমাধান (পাইথন সংস্করণ> ২. 2. থাকলে)। কারণ বাস্তবায়ন %sওএস নির্ভর! এভাবে কোডটি যেকোন যা অপারেটিং সিস্টেম, কখনও ব্যবহার করা উচিত উপর নির্বিশেষে নির্ভরযোগ্যভাবে কাজ চান %s। ২.৩ <পিয়ার ভার্ <২. 2. এর জন্য। যে কোনও এটি সহজেই এটি তৈরি করতে পারে total_seconds():delta.days*86400+delta.seconds+delta.microseconds/1e6
ওয়াং

14
দ্রষ্টব্য: dtঅবশ্যই ইউটিসি-তে থাকতে হবে (স্থানীয় নয়) পাইথন ২.6 / 3 সমর্থন সহ একই উত্তর
jfs

7
ওয়ার্থ উল্লেখ যে আপনি যদি চান সব একটি সত্য UNIX টাইমস্ট্যাম্প এখানে সংজ্ঞায়িত en.wikipedia.org/wiki/Unix_time (এবং তাই শুধুমাত্র এই উত্তরটি থেকে unix_time ফাংশন ব্যবহার করে হবে না) তারপর আপনি delta.total_seconds () int- এ সঙ্গে মোড়ানো উচিত একটি ভাসা দিয়ে শেষ এড়াতে
করফোর্ড

1
কাল গণনা ব্যবহার utcfromtimestamp(0)একটি 'TZ' অফসেট শুধুমাত্র যদি 'TZ' হতে পারে 0. নয় কারণ dt এর মধ্যে dt- epochআছে 'TZ' এটা হিসাব করা যেখানে যুগান্তকারী যেমন ইউটিসি সময়। যুগের গণনার সর্বোত্তম উপায় হ'ল epoch = datetime.datetime(1970, 1, 1)টাইমজোন বিবেচনা করা।
আহ্জ

35
ওহ কেন datetime.utcfromtimestamp(0)tzinfo ছাড়াই একটি ডেটটাইম ফেরায়? এটি ঠিক সেখানে পদ্ধতির নাম, utc থেকে স্টাইমস্ট্যাম্প। এটিকে নির্দোষ বানানোর জন্য আমাকে এরকম কিছু করতে হবে datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)dtটাইমজোন সচেতন হলে এটি প্রয়োজনীয় বা অন্যথায় আপনি পাবেনTypeError: can't subtract offset-naive and offset-aware datetimes
FGreg

168

পাইথন ৩.৩-তে নতুন পদ্ধতি যুক্ত হয়েছে timestamp:

import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()

আপনার প্রশ্নে উল্লেখ করা হয়েছে যে আপনার মিলি সেকেন্ডের দরকার ছিল যা আপনি এটির মতো পেতে পারেন:

milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000

আপনি যদি timestampকোনও নিষ্পাপ ডেটটাইম অবজেক্টে ব্যবহার করেন, তবে ধরে নেওয়া হবে যে এটি স্থানীয় সময় অঞ্চলে রয়েছে। আপনি যদি যা করতে চান তা যদি এটি না হয় তবে সময় অঞ্চল-সচেতন তারিখের সময় অবজেক্টগুলি ব্যবহার করুন।


28
দ্রষ্টব্য: .timestamp()পদ্ধতিটি ধরে নিয়েছে যে একটি নির্লজ্জ ইনপুট ডেটটাইম স্থানীয় সময় অঞ্চলে (এবং স্থানীয় সময়টি দ্ব্যর্থক হতে পারে)। এটি যদি ইউটিসিতে থাকে তবে dt.replace(tzinfo=timezone.utc).timestamp()পরিবর্তে ব্যবহার করুন
jfs

11
ডেটটাইম.টাইমস্ট্যাম্প () এক যুগের সেকেন্ডকে একটি ভাসা হিসাবে ফেরত দেয়। মিলিসেকেন্ডগুলি পেতে: int (ডেটটাইম.টাইমস্ট্যাম্প () * 1000)
Solar.gy

9
এই উত্তরটি কোনও অনুলিপি-পেষ্টযোগ্য উদাহরণ নয়, ডকস.পিথন.আর.আর / লাইব্রেরি / নে -তে মানব-বান্ধব ডক্সের চেতনায়datetime.datetime.timestamp(datetime.datetime.now())
হ'ল

3
৩.6-তে (কমপক্ষে), ডেটটাইম.টাইমস্ট্যাম্প () একটি টাইমজোন সাদাসিধে (tzinfo = কিছুই নয়) তারিখটি ইউটিসি-তে থাকে। আপনার টাইমজোন সেট করা ভাল তাই সর্বদা ভাল: datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()তবে (সর্বদা) সমান নয় ( datetime.datetime.now().timestamp()স্থানীয় টিজেটিটিসি যদি ইউটিসি হয় তবে এই সর্বশেষটি কেবলমাত্র বাকিদের সমান))
ব্লু

1
আপনার আগ্রহের জন্য, বিপরীত হয়] fromtimestamp( docs.python.org/3/library/... )
Flimm

98
>>> 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

ডকুমেন্টেশন:


6
বিটিডব্লিউ, স্ট্রাইফটাইম ("% s") আমার জন্য একটি খালি স্ট্রিং প্রদান করে। দ্বিতীয় উপায় ভাল কাজ করে।
পাভেল ভ্লাসভ

23
শুধুমাত্র দ্বিতীয় নির্ভুলতা রয়েছে
Shuckc

6
পাইথন যেমন '% s' সমর্থন করে না যেমন উইন্ডোজটিতে এটি অনুপস্থিত থাকতে পারে। .timetuple()আয় tm_isdst=-1এটা জোর mktime()অনুমান করা। এটি ডিএসটি চলাকালীন ভুল অনুমান করতে পারে (একটি ত্রুটির +২-৪০% সম্ভাবনা)। '% S' উভয়ই mktime()অতীত তারিখগুলির জন্য ভুল ইউটিসি অফসেট ব্যবহার করতে পারে। আপনার একটি pytz
timeতিহাসিক

1
time.mktime(ts.timetuple())যেখানে
টিএসটি

1
@ সুহাইল: উপরে আমার মন্তব্য পড়ুন mktime/timetuple। এছাড়াও timetuple()একটি সেকেন্ডের ভগ্নাংশগুলি স্ট্রিপ করে এবং প্রশ্নের বিন্দুটি হ'ল মিলিসেকেন্ড যথার্থতার সাথে টাইমস্ট্যাম্প পাওয়া।
jfs


13

আমি এটি এইভাবে করি:

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


2
@ জেফএসেবাস্টিয়ান মাথা উঁচু করার জন্য ধন্যবাদ! আসলে কোন বিবেচনা করা হচ্ছে না। যদি আপনার সার্ভারটি ইউটিসির পরিবর্তে স্থানীয় সময় হয় তবে এটি একটি পার্থক্য আনবে। ইউটিসি ব্যতীত অন্য কোনওটিতে সার্ভার সেট করার কোনও জোরালো কারণ আমি এখনও খুঁজে পাইনি। আমার উদ্দেশ্যটি হ'ল "ইউটিসি লিখুন, স্থানীয় সময় পড়ুন" যাতে আপনি কোথায় থাকছেন সবসময় জানতে পারবেন ...
এস্তানি

2
টাইমজোন অনুমান করার চেষ্টা করে এমকেটাইমের সমস্যাটি এড়াতে আপনি সবসময় এম কেটাইমের পরিবর্তে ক্যালেন্ডার.টাইম ব্যবহার করতে পারেন।
ডেকো

13

@ ক্রিস্টোফারবুল সেকেন্ডে পেতে মাত্র 1000 মিলি সেকেন্ডের সংখ্যা ভাগ করুন
জোনাস

5
আপনি ভুল বুঝেছেন এবং এটি কাছাকাছি ভুল উপায়ে পেয়েছেন। সেকেন্ডস উপরের ফাংশনগুলিতে সমস্ত প্রস্তুত। আপনি এটি মিলিসেকেন্ডে রূপান্তর করতে পারেন তবে এটি একটি সেকেন্ডের যথার্থতা হবে।
ক্রিস্টোফার বুল

1
এই উত্তরটি timeমডিউলটি ব্যবহার করে তবে ওপি datetimeমডিউল সম্পর্কে জিজ্ঞাসা করেছিল । এফডব্লিউআইডাব্লু, সহজতম যুগের int(time.time())
সময়টি

7
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()রেখাচিত্রমালা ফলাফল থেকে এক সেকেন্ডের ভগ্নাংশ কল (কিনা এটা গুরুত্বপূর্ণ আবেদন উপর নির্ভর করে)। এছাড়াও প্রশ্নটি * মিলি * সেকেন্ড সম্পর্কে জিজ্ঞাসা করে, সেকেন্ড নয়
jfs

কোডটি একেবারে পরিষ্কার করতে যে আপনি ইউটিসি ব্যবহার করছেন (এবং এইভাবে যে কেউ এটি পড়তে হবে তা কেবল টাইমএমটি কেবল ইউটিসি) মনে রাখতে হবে না কোডটি একেবারে স্পষ্ট করার জন্য আমি উটকনো () এবং উত্কটাইমআপল () ব্যবহার করতে পছন্দ করি। utctimetuple () কোনও নিখুঁত dtm বস্তুর উপর অনুবাদ বোঝায় না (অতএব utcnav ()) দিয়ে ডিটিটিএম সন্নিবেশ করানো হয়েছে। এছাড়াও, প্রশ্ন উল্লিখিত সেকেন্ড বা মিলিসেকেন্ডে।
করফোর্ড

দ্রষ্টব্য: সর্বশেষ মন্তব্যে বলা উচিত ছিল আমি প্রশ্নটি পড়ার সাথে সাথে বোঝাতে চাইছি তিনি সেকেন্ড বা মিলিসেকেন্ড (সম্ভবত আমার ভুল) চেয়েছিলেন। মিলিসের জন্য কেবল 1000 দ্বারা গুণ করুন (শীর্ষস্থানীয় স্কোরিংয়ের উত্তর অনুসারে)।
করফোর্ড

utctimetuple()একটি সেকেন্ডের স্ট্রিপস ভগ্নাংশ। গুন করে 1000এগুলি ফিরে পাবেন না।
jfs

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

3
>>> 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

[2] http://docs.python.org/2/library/time.html


3

আপনার সময়ের অবজেক্টের সাধারণকরণের সাথে সমাধানের আরও একটি রূপ এখানে রয়েছে:

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

2

পান্ডাস কোডের একটি বিট:

import pandas

def to_millis(dt):
    return int(pandas.to_datetime(dt).value / 1000000)

1
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000

9
এটা ভুল! টাইমটুপলে মিলিসেকেন্ড অন্তর্ভুক্ত নয়, সুতরাং এমকিটাইম মিলিসেকেন্ড রেজোলিউশনের মাধ্যমে যুগটি ফিরিয়ে দেবে না। এক্ষেত্রে এটি অকেজো।
ওয়াং

@ ওয়াং - আপনি সঠিক স্যার, এটি মিলিস, আর কয়েক সেকেন্ডের মধ্যে ফিরে আসবে না
ম্যাটটোড্ড


1
আপনি সরান * 1000, যদিও, আপনি পাবেন seconds_since_epoch। এই উত্তরটি সমর্থন করা কারণ আমি এই মুহুর্তে মিলিসেকেন্ডগুলির বিষয়ে চিন্তা করি না।
মাইকেল শ্যাপার 21

0

উপরের উত্তরের ভিত্তিতে আমি এখানে একটি ফাংশন তৈরি করেছি

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 না করে) ব্যবহার করতে হবে


-14

গোপন তারিখের জন্য ইউনিক্সটাইম স্ট্যাম্পিলিসের জন্য এই অন্যান্য সমাধান।

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;
    } 

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