পাইথন ভবিষ্যতে পাঁচ মিনিট ইউনিক্স টাইমস্ট্যাম্প তৈরি করুন


297

আমাকে ভবিষ্যতে 5 মিনিটের একটি "মেয়াদ উত্তীর্ণ" মান তৈরি করতে হবে, তবে আমি এটি ইউনিক্স টাইমস্ট্যাম্প বিন্যাসে সরবরাহ করতে হবে। আমার এখন পর্যন্ত এটি আছে তবে এটি হ্যাকের মতো মনে হচ্ছে।

def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    epoch = datetime.datetime(1970, 1, 1)
    seconds_in_a_day = 60 * 60 * 24
    five_minutes = datetime.timedelta(seconds=5*60)
    five_minutes_from_now = datetime.datetime.now() + five_minutes
    since_epoch = five_minutes_from_now - epoch
    return since_epoch.days * seconds_in_a_day + since_epoch.seconds

এমন কোনও মডিউল বা ফাংশন রয়েছে যা আমার জন্য টাইমস্ট্যাম্প রূপান্তর করে?


7
আমি এই প্রশ্নের বিষয় পরিবর্তন করার পরামর্শ দিচ্ছি। প্রশ্নটি ভাল তবে ডেটটাইমটিকে ইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করার বিষয়ে নয়। ভবিষ্যতে কীভাবে ইউনিক্সের টাইমস্ট্যাম্প পাবেন তা সম্পর্কে।
ডিএ

আমি একমত নই, @ ডিএ প্রশ্নটি মূলত বলেছে "আমার এক্স এবং ওয়াই করা দরকার I আমার এখন যা আছে তা এখানে Y এক্স করার আরও ভাল উপায় আছে তবে শিরোনাম এবং শরীরে ওয়াই সম্পর্কে স্পষ্টভাবে জিজ্ঞাসা করা হয়েছে
রব কেনেডি

6
আমি এই প্রশ্নের সাথে আপনার সাথে পুরোপুরি একমত, এবং আমি মনে করি এটি একটি ভাল উত্তর সহ একটি ভাল। সমস্যাটি হল "পাইথনের ডেটটাইম টু ইউনিক্স টাইমস্ট্যাম্প" কোনও প্রশ্ন বা উত্তরকে প্রতিফলিত করে না। রূপান্তরটি করার উপায়টি অনুসন্ধান করে আমি এই পোস্টটি পেয়েছি এবং বিভ্রান্তিমূলক সাবজেক্ট লাইনের কারণে আমি সময় হারিয়েছি। আমি পরামর্শ দিচ্ছি: "পাইথন, ভবিষ্যতে ইউনিক্স টাইমস্ট্যাম্প হিসাবে 5 মিনিট"
ডিএ

3
@JimmyKane - কিভাবে একটি তারিখ সময় থেকে একটি টাইমস্ট্যাম্প পেতে একটি চমত্কার ব্যাপক উত্তর এখানে পাওয়া যাবে: stackoverflow.com/questions/8777753/...
টিম Tisdall

@ টিমটিসডাল হ্যাঁ যেহেতু শিরোনামটি পরিবর্তিত হয়েছে তা কোনও অর্থবোধ করে না
জিমি কেন

উত্তর:


349

আরেকটি উপায় হ'ল calendar.timegm:

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return calendar.timegm(future.timetuple())

এটি %sপতাকাঙ্কণের চেয়েও বহনযোগ্য strftime(যা উইন্ডোজে কাজ করে না)।


ধন্যবাদ ডি.শ্যাওলি সহায়তা (ডেটটাইম.টিমেডেল্টা) সেই শর্টকাটের কথা উল্লেখ করেনি। এটিতে কেবল দিন, সেকেন্ড এবং মাইক্রোসেকেন্ড ছিল।
ড্যানিয়েল রোডেন

12
উল্লেখ্য, আগের দুই মন্তব্য মিশ্রন, ডান সমাধান: calendar.timegm(future.utctimetuple())। এটি নিশ্চিত করে যে কোনও ইউটিসি সময় প্রবেশ করেছে calendar.timegm
ছায়াময়কারী

1
@ টিম্বলউইডের মন্তব্যে যথেষ্ট পরিমাণে উত্সাহ দেওয়া যাবে না। যদি আপনি একটি ইউনিক্স টাইমস্ট্যাম্প (এবং তাই ইউটিসি-তে একটি) পাওয়ার চেষ্টা করছেন, ক্যালেন্ডার.টাইমজিএম ব্যবহার করুন।
বিয়ালেকি

@ টিম্বলওয়েড, ডান। আপনি যদি এমকিটাইম প্লাস জিএমটাইম (0) ব্যবহার করেন তবে ইউটিসি ছাড়াও যে কোনও সময় অঞ্চলের জন্য ননজারো রাউন্ডট্রিপ ডেল্টার ফলস্বরূপ: যেমন `সময়.এমকিটাইম (ডেটটাইম.ফ্রোমটাইম স্ট্যাম্প (টাইম.এমকিটাইম (টাইম.এমটাইম (0))) time টাইমআপআপ ())` 21600.0আমার ইউনিক্স মেশিনের টিজেডের জন্য ০.০ এর পরিবর্তে সেকেন্ড (hours ঘন্টা) দেয়
hobs

আপনি পেতে চান ইউটিসি টাইমস্ট্যাম্প আপনি এই ব্যবহার করা উচিত: calendar.timegm(datetime.datetime.utcnow().timetuple())। ব্যবহারের পদ্ধতিটি datetime.datetime.now().utctimetuple()আমার পক্ষে কাজ করে না (পাইথন ৩.২)।
Wookie88

155

পাইথন> = 3.3 এ আপনি ভাসা হিসাবে টাইমস্ট্যাম্প পেতে টাইমস্ট্যাম্প () পদ্ধতিতে কল করতে পারেন ।

import datetime
current_time = datetime.datetime.now(datetime.timezone.utc)
unix_timestamp = current_time.timestamp() # works if Python >= 3.3

unix_timestamp_plus_5_min = unix_timestamp + (5 * 60)  # 5 min * 60 seconds

4
এই জন্য +1। এটি অনেক বেশি প্রদর্শিত হবে, কারণ পাইথন 3-এ এটি কীভাবে করা যায় তা পরিষ্কার উপায়
ভিক্টর স্টেস্কালা

2
@ স্কট 654 আমি ভেবেছিলাম মন্তব্যের শুরুতে এটি সঠিকভাবে হওয়া এটি যথেষ্ট পরিষ্কার করে দিয়েছে, তবে আমি এটিতে কিছুটা সাহসীও যুক্ত করেছি।
টিম টিসডাল

1
আমি কোড ব্লকে একটি মন্তব্য হিসাবে নোটটি তৈরি করবো কারণ আমরা সকলেই প্রথমে উত্তরে কোডটি স্ক্যান করেছিলাম এবং কোডটি ভাল মনে হয় তবে কেবল বাকীটি পড়ি। ভাল উত্তর যদিও।
ম্যাথিউ পারডন

2
স্থানীয় সময় অস্পষ্ট হতে পারে । উদাহরণটি ( datetime.now()) খারাপ কারণ এটি স্থানীয় সময়কে উপস্থাপন করে এমন নিষ্পাপ ডেটটাইম অবজেক্টগুলির ব্যবহারকে উত্সাহ দেয় এবং এটি ডিএসটি ট্রানজিশনের সময় ব্যর্থ হতে পারে (সহজাত অস্পষ্টতার কারণে)। ts = datetime.now(timezone.utc).timestamp()পরিবর্তে আপনি ব্যবহার করতে পারেন ।
jfs

@ জেএফএসবেস্তিয়ান - ভাল পয়েন্ট। আমি আমদানিতে যুক্ত করতে চাইনি, যদিও আমি এটিকে পরিবর্তন করেছিলাম utcnow()। আমি এমন মেশিনগুলিতে কাজ করতে অভ্যস্ত যেখানে টাইমজোনটি ইউটিসিতে সেট করা আছে, তবে এটি কোড স্নিপেটে ধরে নেওয়া উচিত নয়।
টিম টিসডাল

139

সবেমাত্র এটি পাওয়া গেছে এবং এর চেয়ে ছোটও।

import time
def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    return int(time.time()+300)

12
এটি প্রশ্নের উত্তর দেয় না।
জেসি ঝিলন

22
@ জেএসডিহিল এটি প্রশ্নের উত্তর দেয় (ভবিষ্যতে পাঁচ মিনিট ইউনিক্সের টাইমস্ট্যাম্প তৈরি করুন), কেবল শিরোনাম নয়।
ডিবিআর

3
time.time()ফিরে সেট করা যেতে পারে। ভবিষ্যতে 5 মিনিটের একটি "মেয়াদ উত্তীর্ণ" মান তৈরি করতে time.monotonic()আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে আপনার অ্যানালগের প্রয়োজন হতে পারে ।
jfs

@ jf-sebastian time.monotonic () কোনও UNIX টাইমস্ট্যাম্প ফেরত দেয় না, এটি একটি অপরিবর্তিত রেফারেন্স পয়েন্ট সহ একটি টাইমস্ট্যাম্প দেয়।
rspeer

@ স্প্রেয়ার: হ্যাঁ, ডকস যেমন বলেছেন , কেবলমাত্র পরপর কলগুলির মধ্যে পার্থক্য বৈধ। কিনা monotonicব্যবহার করা যেতে পারে আপনার ব্যবহারের-কেস যেমন উপর নির্ভর করে, subprocessমডিউল ব্যবহার বাস্তবায়ন করে timeoutবিকল্প।
jfs

57

এটি আপনার প্রয়োজন:

import time
import datetime
n = datetime.datetime.now()
unix_time = time.mktime(n.timetuple())

এটি কীভাবে আলাদা বা এক 'ক্যাট প্লাস প্লাস' সরবরাহ করা যুক্ত করে?
ডেভিড

3
ইজি এটি "পাইথন ডেটটাইম টু ইউনিক্স টাইমস্ট্যাম্প" প্রশ্নের উত্তর, যখন ক্যাট প্লাস প্লাস "পাইথনের ডেটটাইম যা ইউনিক্স টাইমস্ট্যাম্পের 5 মিনিটের মধ্যে হবে" প্রশ্নের উত্তর দেয়। সুতরাং এই এক পরিষ্কার এবং সুস্পষ্ট।
চলমান .t

@ চলমান.ট: এটি আমাকে স্মরণ করিয়ে দেয়: "প্রতিটি সমস্যার সরল, সুস্পষ্ট এবং ভুল সমাধান রয়েছে"। এর সাথে সম্ভাব্য সমস্যাগুলিmktime(dt.timetuple()) দেখুন । datetime.now(timezone.utc).timestamp()@ টিম টিসডাল দ্বারা প্রদত্ত পাইথন ৩.৩++ এর সমাধান। অন্যথায় (dt - epoch).total_seconds()ব্যবহার করা যেতে পারে
jfs

@ জেএসএবেস্টিয়ান যদি আমি সত্যিই স্থানীয় সময়গুলিতে সমস্ত গণনা শুরু করতে চাই? এটি ক্ষেত্রে যখন উদাহরণস্বরূপ। স্থানীয় সময় কিনা এমন একটি নির্লজ্জ স্ট্রিং পার্স করতে এবং সিদ্ধান্ত নিতে পারে যে সেই নির্দিষ্ট সময়টিতে ডিএসটি কার্যকর ছিল কিনা?
n611x007

1
@ নেক্সা: হ্যাঁ, কিছু স্থানীয় সময় অস্পষ্ট বা অস্তিত্বহীন। এছাড়াও টাইমজোন অফসেট ডিএসটি ব্যতীত অন্য কারণেও আলাদা হতে পারে (সঠিক অফসেটটি খুঁজে পেতে আপনার কাছে পাইটজ জাতীয় tz ডাটাবেস প্রয়োজন)। স্থানীয় সময় মানে যা কিছু স্থানীয় রাজনীতিবিদ সময়কে মাপার জন্য একটি ভাল ধারণা বলে মনে করেন, এটি অত্যন্ত অনিয়মিত হতে পারে।
jfs

48

আপনি ফর্ম্যাট স্ট্রিং datetime.strftimeব্যবহার করে ইপচ ফর্মে সময় পেতে ব্যবহার করতে পারেন %s:

def expires():
    future = datetime.datetime.now() + datetime.timedelta(seconds=5*60)
    return int(future.strftime("%s"))

দ্রষ্টব্য: এটি কেবল লিনাক্সের অধীনে কাজ করে এবং এই পদ্ধতিটি টাইমজোনগুলির সাথে কাজ করে না।


32
এটি কিছুটা অননুমোদিত আচরণ ( পাইথন.আর / ডক / কর্নার / লাইব্রেরি / ডেটটাইম html )। লিনাক্সের অধীনে কাজ করা এবং উইন 32 (উত্পন্ন ValueError: Invalid format string) এর অধীনে কাজ না করা বলে মনে হচ্ছে ।
অ্যান্টনি হ্যাচকিন্স 21

3
এই পদ্ধতিটি সময় অঞ্চলগুলির সাথে কাজ করে না। পরিবর্তিত সময় অঞ্চল একই ফলাফলের তারিখের সময় (2013,12,7, tzinfo = টাইমজোন ("আমেরিকা / শিকাগো")) দেবে str রিগা "))। স্ট্রফটাইম ("% s ") 1386385200
মার্টিনস বালোডিস

11

datetimeডেটটাইম অবজেক্ট থেকে পিক্সিক টাইমস্ট্যাম্পে রূপান্তর করার জন্য এখানে একটি কম ভাঙা- ভিত্তিক সমাধান:

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return (future - datetime.datetime(1970, 1, 1)).total_seconds()

পাইথনের ইউটিসি টাইমস্ট্যাম্পে ডেটটাইম.ডেট রূপান্তর করতে আরও বিশদ দেখুন ।


6
def in_unix(input):
  start = datetime.datetime(year=1970,month=1,day=1)
  diff = input - start
  return diff.total_seconds()

4

আপনি রূপান্তর শুরু করার আগে আপনি যে সমস্ত তারিখগুলি ব্যবহার করছেন তা ইউটিসি টাইমজোনগুলিতে রয়েছে তা নিশ্চিত করা কীটি হ'ল। Http://pytz.sourceforge.net/ দেখুনকীভাবে এটি সঠিকভাবে করতে হয় তা জানতে । ইউটিসি-তে সাধারণকরণের মাধ্যমে আপনি দিবালোকের সঞ্চয় স্থানান্তরের অস্পষ্টতা দূর করেন। তারপরে আপনি ইউনিক্স যুগ থেকে দূরত্ব গণনা করতে নিরাপদে টাইমডেল্টা ব্যবহার করতে পারেন এবং তারপরে সেকেন্ড বা মিলিসেকেন্ডে রূপান্তর করতে পারেন।

নোট করুন যে ফলাফলের ইউনিক্স টাইমস্ট্যাম্পটি নিজেই ইউটিসি টাইম জোনে। আপনি যদি স্থানীয়ায়িত টাইমজোনটিতে টাইমস্ট্যাম্পটি দেখতে চান তবে আপনাকে অন্য একটি রূপান্তর করতে হবে।

এছাড়াও মনে রাখবেন যে এটি কেবল 1970 এর পরে তারিখগুলির জন্য কাজ করবে।

   import datetime
   import pytz

   UNIX_EPOCH = datetime.datetime(1970, 1, 1, 0, 0, tzinfo = pytz.utc)
   def EPOCH(utc_datetime):
      delta = utc_datetime - UNIX_EPOCH
      seconds = delta.total_seconds()
      ms = seconds * 1000
      return ms

3
দ্রষ্টব্য: আমি "স্থানীয় সময়সীমায় [ইউনিক্স] টাইমস্ট্যাম্প" বুঝতে পারি না। টাইমস্ট্যাম্পটি একই (বিগত সেকেন্ড পরে 1970-01-01 00:00:00+00:00)। স্থানীয় সময় datetime.fromtimestamp(ts)
অঞ্চলটিতে একটি নিষ্পাপ ডেটটাইম

4

নীচে উপরের উত্তরের উপর ভিত্তি করে (মিলিসেকেন্ডগুলির জন্য একটি সংশোধন) এবং টাইমজোনগুলি datetime.timestamp()ব্যবহার করার সময় পাইথন 3 এর 3.3 এর আগে এমুলেট করে।

def datetime_timestamp(datetime):
    '''
    Equivalent to datetime.timestamp() for pre-3.3
    '''
    try:
        return datetime.timestamp()
    except AttributeError:
        utc_datetime = datetime.astimezone(utc)
        return timegm(utc_datetime.timetuple()) + utc_datetime.microsecond / 1e6

জিজ্ঞাসিত প্রশ্নের কঠোরভাবে উত্তর দিতে, আপনি চান:

datetime_timestamp(my_datetime) + 5 * 60

datetime_timestampসহজ-তারিখের অংশ । তবে আপনি যদি সেই প্যাকেজটি ব্যবহার করে থাকেন তবে আপনি সম্ভবত টাইপ করতে চান:

SimpleDate(my_datetime).timestamp + 5 * 60

যা আমার_ডেটটাইমের জন্য আরও অনেক ফর্ম্যাট / প্রকারগুলি পরিচালনা করে।


আপনি 5 মিনিট যোগ করতে (5 * 60) যুক্ত করা উচিত? আমি মনে করি যে কেবল 5 যোগ করে টাইমস্ট্যাম্পে কেবল 5 সেকেন্ড যুক্ত হবে।
টিম টিসডাল

1
def expiration_time():
    import datetime,calendar
    timestamp = calendar.timegm(datetime.datetime.now().timetuple())
    returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
    return returnValue

1

দ্রষ্টব্য যে timedelta.total_seconds()পাইথন -২.7 + এর সাথে কাজ করা সমাধান । calendar.timegm(future.utctimetuple())পাইথনের নিম্ন সংস্করণগুলির জন্য ব্যবহার করুন ।

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