ডেটটাইমটিকে ইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করুন এবং এটিকে অজগরে ফিরে রূপান্তর করুন


184

আমার আছে dt = datetime(2013,9,1,11)এবং আমি এই ডেটটাইম অবজেক্টের একটি ইউনিক্স টাইমস্ট্যাম্প পেতে চাই।

আমি যখন (dt - datetime(1970,1,1)).total_seconds()টাইমস্ট্যাম্প পেয়েছিলাম 1378033200

এটিকে রূপান্তর করার সময় datetime.fromtimestampআমি পেয়েছিলাম datetime.datetime(2013, 9, 1, 6, 0)

ঘন্টা মেলে না। আমি এখানে কি মিস করেছি?


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

পার্শ্ব দ্রষ্টব্য হিসাবে, আপনি যদি পাইথন ৩.৩+ ব্যবহার করেন তবে আপনি সত্যিকার অর্থে timestampনিজেই চেষ্টা করার পরিবর্তে পদ্ধতিটি ব্যবহার করতে চান । একটি জিনিস, এটি সম্পূর্ণ টাইম অঞ্চলগুলি থেকে নিষ্পাপ সময় বিয়োগের সম্ভাবনা সম্পূর্ণভাবে এড়িয়ে যায়।
অবার্নেট

1
কোথা dtথেকে আসে? এটি ইউটিসিতে স্থানীয় সময় বা সময়?
jfs

2
@ বার্নার্ট আমি সমস্ত কোডপেজ এবং ইউনিকোড প্রতীকগুলি পরিষ্কার করার জন্য একটি অনুরোধও জমা দিতে চাই, অর্থাত্, সমস্ত অ-আসকি এবং অ-ডিফল্ট-কোডপেজ ভাষা নিষিদ্ধ করার জন্য। প্রতীকগুলির চিত্রগুলি এখনও অনুমোদিত।
ড্যানিয়েল এফ

6
@ ড্যানিয়েলএফ: অনুরোধ অস্বীকার করা হয়েছে। আমি এখানে এক-বিশ্ব ভাষা তৈরি করতে আগ্রহী নই, এবং আমরা না থাকলেও আমি historicalতিহাসিক ভাষাবিদ ও টলকীয়িয়ান পন্ডিতদের পক্ষে জীবনকে অসম্ভব করে তুলতে চাই না। ইউনিকোড ইতিমধ্যে সমস্যাটি সমাধান করে, নির্দিষ্ট সংস্থা এবং পণ্য ব্যতীত (টিআরএন কনসোর্টিয়াম, জাপানী সফ্টওয়্যার যা ইউটিএফ -8 এর উপরে শিফট-জিআইএস ব্যবহার করে, মাইক্রোসফ্ট এখনও এমন একটি ওএস সরবরাহ করে যা ব্যবহারকারীর পাঠ্য ফাইলগুলির জন্য সিপি 1252 ডিফল্ট করে এবং বিভিন্ন এসডিকে যে ইউটিএফের ভান করে -16 হ'ল একটি নির্দিষ্ট-প্রস্থের অক্ষর এবং / অথবা ইউনিকোডের মতো একই জিনিস) তাদের লাইনে আনতে শাস্তি দেওয়া দরকার।
abarnert

উত্তর:


104

আপনি এখানে যা মিস করেছেন তা হ'ল সময় অঞ্চল।

সম্ভবত আপনি ইউটিসি থেকে পাঁচ ঘন্টা বন্ধ রেখেছেন, সুতরাং 2013-09-01T11: 00: 00 স্থানীয় এবং 2013-09-01T06: 00: 00Z একই সময়।

আপনাকে datetimeডক্সগুলির শীর্ষগুলি পড়তে হবে , যা টাইম অঞ্চল এবং "নিষ্পাপ" এবং "সচেতন" অবজেক্ট সম্পর্কে ব্যাখ্যা করে।

যদি আপনার আসল নিষ্পাপ ডেটটাইমটি ইউটিসি ছিল, এটি পুনরুদ্ধার করার উপায়টি utcfromtimestampপরিবর্তে ব্যবহার করা fromtimestamp

অন্যদিকে, যদি আপনার আসল নিষ্পাপ ডেটটাইম স্থানীয় হয়, আপনার এটির থেকে প্রথমে কোনও ইউটিসি টাইমস্ট্যাম্পটি বিয়োগ করা উচিত হয়নি; datetime.fromtimestamp(0)পরিবর্তে ব্যবহার করুন।

অথবা, যদি আপনার একটি সচেতন তারিখের সময় অবজেক্ট থাকে তবে আপনাকে উভয় পক্ষের স্থানীয় (সচেতন) যুগটি ব্যবহার করতে হবে বা ইউটিসি থেকে স্পষ্টত রূপান্তর করতে হবে।

পাইথন ৩.৩ বা তার পরে বা আপনার যদি আপগ্রেড করতে পারেন তবে আপনি timestampনিজে কীভাবে এটি করবেন তা বোঝার চেষ্টা না করে পদ্ধতিটি ব্যবহার করে আপনি এই সমস্ত সমস্যা এড়াতে পারেন । এমনকি যদি আপনি না করেন তবে আপনি তার উত্স কোড ধার করা বিবেচনা করতে পারেন ।

(এবং যদি আপনি পাইথন ৩.৪ এর জন্য অপেক্ষা করতে পারেন তবে মনে হচ্ছে পিইপি 341 সম্ভবত এটি চূড়ান্ত রিলিজে পরিণত করবে, যার অর্থ জেএফ সেবাস্তিয়ান এবং আমি যে সমস্ত স্টাফ মন্তব্যে বলছিলাম তা কেবল স্টাডলিব দিয়ে করণীয় হওয়া উচিত, এবং ইউনিক্স এবং উইন্ডোজ উভয় ক্ষেত্রে একইভাবে কাজ করা))


1
যদি dtস্থানীয় সময় অঞ্চলে থাকে তবে প্রশ্নের সূত্রটি ভুল datetime.fromtimestamp(0)(বর্তমান datetime(1970, 1,1)টাইমজোনটির epoch) এর পরিবর্তে (ইউটিসি-তে ইউনিক্স যুগ) ব্যবহার করা উচিত ।
jfs

@ জেফাসেবাস্টিয়ান: আমি তিনটি সম্ভাবনার বিশদটি কভার করতে চাইনি, তবে আমি অনুমান করি আপনি ঠিক বলেছেন, আমার উচিত।
অবসর

বিটিডব্লিউ, fromtimestamp(0)যদি সিস্টেমটি উইন্ডোজে historicalতিহাসিক টাইমজোন সম্পর্কিত তথ্য সংরক্ষণ না করে তবে ব্যর্থ হতে পারে। pytzএই ক্ষেত্রে ব্যবহার করা যেতে পারে।
jfs

@ জেফাসেবাস্টিয়ান: pytzতবে আপনি কোন টাইমজোনটিতে রয়েছেন তা যদি আপনি ইতিমধ্যে না জানেন তবে সহায়তা করে না; প্রোগ্রামটিমেটিকভাবে এটি করার জন্য আপনার একটি আলাদা লাইব্রেরি দরকার যা বর্তমান উইন্ডোজ টাইমজোন পায় এবং এটিকে একটি pytzটাইমজোনতে রূপান্তর করে এবং / অথবা নাম অনুসারে এটি সন্ধান করে।
অবার্নেট

tzlocalউইন্ডোতে কাজ করে এমন মডিউলও রয়েছে। আপনি কীভাবে স্থানীয় সময়ে ইউটিসি সময়কে রূপান্তর করতে পারেন তা এখানে ।
jfs

141

সমাধান হয়

import time
import datetime
d = datetime.date(2015,1,5)

unixtime = time.mktime(d.timetuple())

12
এটি ধরে নেওয়া হয় যে dএকটি নির্লজ্জ তারিখ / তারিখের সময় অবজেক্ট যা স্থানীয় সময়কে উপস্থাপন করে (এটি অস্পষ্ট সময় বা অতীত / ভবিষ্যতের তারিখগুলির জন্য ব্যর্থ হতে পারে যদি ওএস কোনও historicalতিহাসিক tz ডিবি সরবরাহ না করে (ইউটিসি অফসেটটি স্থানীয়ভাবে অতীতে ভিন্ন হতে পারে সময় অঞ্চল)). আরও বিকল্প
jfs

6
দেখে মনে হচ্ছে ভাসমান-পয়েন্ট সমাধানটি কারও মনে নেই। এটা কি সবার পক্ষে সুস্পষ্ট?
ইভান বালাশভ

4
এটি মাইক্রোসেকেন্ডগুলি ড্রপ করে। আকর্ষণীয় হতে পারে।
আলফ

কেবলমাত্র সমস্যা হ'ল আপনি টাইমজোনটিকে অ্যাকাউন্টে নিবেন না।
ব্লেয়ার 23

এটা করা উচিত নয়। আপনার যদি টিজেড সামঞ্জস্য করতে হয় তবে আপনাকে প্রথমে এটি করা দরকার।
মার্সিন ওরোলোস্কি

69

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

>>> import datetime
>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

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

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

5
টাইমজোনগুলি আমলে নেয় না।
ব্লেয়ারজ 23

3
আপনি ব্যবহার করতে চান না %s, কারণ এটি বর্তমানে আপনি যে সিস্টেমটি চালু করছেন তার ঘড়িতে স্থানীয়ীকৃত হবে। আপনার কেবলমাত্র .timestamp()সঠিক সময় / ইউনিক্স সময় পেতে ব্যবহার করা উচিত ।
ব্লেয়ারজ 23

3
%sউইন্ডোজ সিস্টেমগুলিতে ( ValueError: Invalid format string)
chrki

1
@ amitnair92 সবেমাত্র লিখুন 8বা9
ফ্রান্সিসকো কোস্টার

54

এ থেকে কোনও পসিক্স টাইমস্ট্যাম্প তৈরি করার জন্য এই অভিব্যক্তিটির চেয়ে dt,

(dt - datetime(1970,1,1)).total_seconds()

এটা ব্যবহার কর:

int(dt.strftime("%s"))

আমি দ্বিতীয় উদাহরণটি ব্যবহার করে আপনার উদাহরণে সঠিক উত্তর পেয়েছি।

সম্পাদনা: কিছু ফলোআপ ... কিছু মন্তব্য করার পর (নিচে দেখুন), আমি সমর্থন অভাব বা ডকুমেন্টেশন সম্পর্কে জানতে আগ্রহী ছিল %sমধ্যেstrftime । আমি যা পেয়েছি তা এখানে:

ইন পাইথন উৎস জন্য datetimeএবং time, স্ট্রিং STRFTIME_FORMAT_CODESআমাদের বলে:

"Other codes may be available on your platform.
 See documentation for the C library strftime function."

সুতরাং এখন যদি আমরা man strftime(ম্যাক ওএস এক্সের মতো বিএসডি সিস্টেমগুলিতে), আপনি এর জন্য সমর্থন পাবেন %s:

"%s is replaced by the number of seconds since the Epoch, UTC (see mktime(3))."

যাইহোক, সে কারণেই %s এটির সিস্টেমে কাজ করে। তবে ওপি-র সমস্যার আরও ভাল সমাধান রয়েছে (যেগুলি টাইমজোনগুলিকে বিবেচনায় নেয়)। @ অবনার্টের গৃহীত উত্তরগুলি এখানে দেখুন।


4
এটি অননুমোদিত আচরণ (আমি বিশ্বাস করি)। উইন্ডোজ উদাহরণস্বরূপ এটি "অবৈধ ফর্ম্যাট স্ট্রিং" এর ফলাফল দেয়।
ক্রিসেন্ট টাটকা

পুনঃটুইট তুমি ঠিক হতে পারো. আমি strftime("%s")ডকুমেন্টেশনে দেখছি না, আমি ম্যাক এবং লিনাক্সে কাজ করার জন্য এটি কেবল নিশ্চিত করেছি। ধন্যবাদ।
ড্যারেন স্টোন

1
স্পষ্টতই এটি tzinfo ক্ষেত্র উপেক্ষা করে।
ড্যানিয়েল এফ

1
@ ড্যারেনস্টোন: আপনার উত্সটি পড়ার দরকার নেই। উভয় time.strftime()এবং datetime.strftimeডকুমেন্টেশন strftime(3)অসমর্থিত নির্দেশাবলীর জন্য প্ল্যাটফর্মের কার্যক্রমে প্রতিনিধি দেয় । %sএমনকি ম্যাক ওএস এক্সেও ব্যর্থ হতে পারে উদাহরণস্বরূপ, ডেটটাইম.স্ট্রিটাইম ('% s') এর উচিত tzinfo কে সম্মান করা
jfs

1
আপনি কখনই ব্যবহার করবেন না %sযেহেতু আপনি কেবলমাত্র আপনার চালু সিস্টেমের স্থানীয়করণের সিস্টেম সময়টি ব্যবহার করবেন। আপনি .timestamp()যদি সত্যই ইউনিক্স টাইমস্ট্যাম্প পাওয়ার চেষ্টা করছেন তবে আপনি ব্যবহার করতে চান ।
ব্লেয়ারজ 23

6

ইউটিসি সময় অঞ্চলগুলির সাথে কাজ করার জন্য:

time_stamp = calendar.timegm(dt.timetuple())

datetime.utcfromtimestamp(time_stamp)

অনুসন্ধানের এক ঘন্টা পরে, এটি কেবলমাত্র উত্তরটি কাজ করেছিল: ')
কুরাইশী

4

আপনি সময় অঞ্চল তথ্য (ইতিমধ্যে উত্তর দেওয়া হয়েছে, সম্মত) মিস করেছেন

arrow প্যাকেজ তারিখের সময় সহ এই নির্যাতন এড়াতে পারবেন; এটি ইতিমধ্যে লিখিত, পরীক্ষিত, পাইপি-প্রকাশিত, ক্রস-পাইথন (২.6 - ৩.১৫৫ x) রয়েছে।

যা তোমার দরকার: pip install arrow (বা নির্ভরতা যুক্ত করুন)

আপনার ক্ষেত্রে সমাধান

dt = datetime(2013,9,1,11)
arrow.get(dt).timestamp
# >>> 1378033200

bc = arrow.get(1378033200).datetime
print(bc)
# >>> datetime.datetime(2013, 9, 1, 11, 0, tzinfo=tzutc())
print(bc.isoformat())
# >>> '2013-09-01T11:00:00+00:00'

3

যদি আপনার ডেটটাইম অবজেক্টটি ইউটিসি সময়কে উপস্থাপন করে তবে সময়.এমকিটাইম ব্যবহার করবেন না, কারণ এটি ধরে নেয় যে টিপলটি আপনার স্থানীয় সময় অঞ্চলটিতে রয়েছে। পরিবর্তে, ক্যালেন্ডার.টাইম ব্যবহার করুন:

>>> import datetime, calendar
>>> d = datetime.datetime(1970, 1, 1, 0, 1, 0)
>>> calendar.timegm(d.timetuple())
60

2

ওয়েল, ইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করার সময়, অজগরটি মূলত ইউটিসিকে ধরে নিচ্ছে, তবে এটি রূপান্তর করার সময় এটি আপনাকে আপনার স্থানীয় সময় অঞ্চলে রূপান্তর করার তারিখ দেয় give

এই প্রশ্নটি দেখুন / উত্তর; ডেটটাইম.ডেটটাইম.ফর্মটাইম স্ট্যাম্প () দ্বারা টাইমজোন ব্যবহার করুন


1
def dt2ts(dt, utc=False):
    if utc:
        return calendar.timegm(dt.timetuple())
    if dt.tzinfo is None:
        return int(time.mktime(dt.timetuple()))
    utc_dt = dt.astimezone(tz.tzutc()).timetuple()
    return calendar.timegm(utc_dt)

আপনি ইউটিসি টাইমস্ট্যাম্প চাইলে: time.mktimeঠিক স্থানীয় DT ব্যবহার করুন calendar.timegmনিরাপদ কিন্তু DT UTC জোন তাই UTC করার জোন পরিবর্তন করতে হবে। যদি ইউটিসিতে কেবলমাত্র ব্যবহার করুন calendar.timegm


1
def datetime_to_epoch(d1):

    # create 1,1,1970 in same timezone as d1
    d2 = datetime(1970, 1, 1, tzinfo=d1.tzinfo)
    time_delta = d1 - d2
    ts = int(time_delta.total_seconds())
    return ts


def epoch_to_datetime_string(ts, tz_name="UTC"):
    x_timezone = timezone(tz_name)
    d1 = datetime.fromtimestamp(ts, x_timezone)
    x = d1.strftime("%d %B %Y %H:%M:%S")
    return x

0

এই শ্রেণিটি আপনার প্রয়োজনগুলি কভার করবে, আপনি কনভার্ট ইউনিক্সটোডেটটাইমে পরিবর্তন করতে পারবেন এবং কোন ফাংশনটিতে আপনি এটি ভিত্তিক অফ পরিচালনা করতে চান তা কল করতে পারবেন।

from datetime import datetime
import time

class ConvertUnixToDatetime:
    def __init__(self, date):
        self.date = date

    # Convert unix to date object
    def convert_unix(self):
        unix = self.date

        # Check if unix is a string or int & proceeds with correct conversion
        if type(unix).__name__ == 'str':
            unix = int(unix[0:10])
        else:
            unix = int(str(unix)[0:10])

        date = datetime.utcfromtimestamp(unix).strftime('%Y-%m-%d %H:%M:%S')

        return date

    # Convert date to unix object
    def convert_date(self):
        date = self.date

        # Check if datetime object or raise ValueError
        if type(date).__name__ == 'datetime':
            unixtime = int(time.mktime(date.timetuple()))
        else:
            raise ValueError('You are trying to pass a None Datetime object')
        return type(unixtime).__name__, unixtime


if __name__ == '__main__':

    # Test Date
    date_test = ConvertUnixToDatetime(datetime.today())
    date_test = date_test.convert_date()
    print(date_test)

    # Test Unix
    unix_test = ConvertUnixToDatetime(date_test[1])
    print(unix_test.convert_unix())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.