كتابة وظيفة لعرض اليوم الحالي باستخدام time_t؟

StackOverflow https://stackoverflow.com/questions/1445236

  •  22-07-2019
  •  | 
  •  

سؤال

ولقد تم كتابة تحويل الوقت لاتخاذ أنظمة time_t وتحويله إلى الإنسان للقراءة التاريخ / الوقت. أوه، وهذا هو بلدي الثاني الثعبان النصي من أي وقت مضى. سنترك هذه الحقيقة جانبا والمضي قدما.

ويتم استضافتها السيناريو الكامل هنا .

وكانت

والمحولات الكتابة للسنة وشهر وسهلة إلى حد ما، ولكني وصل الى طريق مسدود خطير محاولة للحصول على يوم عمل. كما ترون، لقد كنت تحاول القوة الغاشمة طريقي على طول الطريق من 1970 إلى اليوم. لسوء الحظ، اليوم يخرج كما -105.

لا أحد يعرف من طريقة أفضل للقيام بذلك، أو وسيلة لإصلاح ما لقد حاولت هنا؟ انها حاليا 03:30، لذلك فمن الممكن جدا أنا في عداد المفقودين شيء واضح.

عذرا، لقد نسيت أن نلاحظ أن أفعله بذلك يدويا من أجل معرفة الثعبان. القيام بذلك عن طريق وظائف تاريخ الهزائم الغرض، للأسف.

هل كانت مفيدة؟

المحلول

و(أفترض أنك تفعل هذا لتعلم بيثون، ولذا فإنني سوف نشير إلى أخطاء في التعليمات البرمجية).

>>> years = SecondsSinceEpoch / 31540000

وNonononono. لا يمكنك أن تفعل ذلك. بعض السنوات يكون 31536000 ثواني، والبعض الآخر 31622400 ثواني.

>>> if calendar.isleap(yeariterator) == True:

وأنت لست بحاجة لاختبار إذا كانت قيمة حقيقية صحيحة. :-) هل:

>>> if calendar.isleap(yeariterator):

وبدلا من ذلك.

وتغيير أيضا:

>>> yeariterator = 1969
>>> iterator = 0
>>> while yeariterator < yearsfordayfunction:
>>>     yeariterator = yeariterator + 1

ل:

<اقتباس فقرة>   <اقتباس فقرة>     <اقتباس فقرة>       

ولyeariterator في مجموعة (1970، yearsfordayfunction):

       

وهذا أيضا إصلاح الخطأ الخاص بك: أنت لا تتوقف حتى بعد عام 2009، حتى تحصل على الإجابة -105، لأن هناك 105 الأيام المتبقية من العام

.

وأيضا، ليس هناك فائدة كبيرة في حساب شهرا بعد شهر. سنة بعد سنة يعمل بشكل جيد.

    for yeariterator in range(1970, yearsfordayfunction):
            if calendar.isleap(yeariterator) == True:
                    days = days - 366
            else:
                    days = days - 365

ومسافة بادئة من 8 المساحات هو الكثير. 4 هو أكثر شيوعا.

وأيضا، فما استقاموا لكم فاستقيموا حساب عام ويوم من السنة في أسلوب واحد، بدلا من القيام بذلك مرتين.

def YearDay():
    SecondsSinceEpoch = int(time.time())
    days = SecondsSinceEpoch // 86400 # Double slash means floored int.
    year = 1970
    while True:
            if calendar.isleap(year):
                    days -= 366
            else:
                    days -= 365
            year += 1
            if calendar.isleap(year):
                    if days <= 366:
                            return year, days
            else:
                    if days <= 365:
                            return year, days


def MonthDay(year, day):
    if calendar.isleap(year):
            monthstarts = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]
    else:
            monthstarts = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]

    month = 0
    for start in monthstarts:
            if start > day:
                    return month, day - monthstarts[month-1] + 1
            month += 1

نصائح أخرى

لماذا لا تستخدم:

from datetime import datetime
the_date = datetime.fromtimestamp(the_time)
print(the_date.strftime('%Y %B %d'))

وحدة التاريخ والوقت يتعامل مع جميع الحالات حافة - سنة كبيسة، قفزة ثانية، قفزة أيام - وكذلك تحويل المنطقة الزمنية (مع اختياري الحجة الثانية)

ويمكنك أن تفعل ذلك إما مع time.strftime :

>>> import time
>>> time.strftime('%Y %B %d')
'2009 September 18'

datetime.date.strftime :

>>> import datetime
>>> datetime.date.today().strftime('%Y %B %d')
'2009 September 18'

وسوف نشير أيضا إلى شيء غريب في الشفرة التي نشرت:

    try:
            SecondsSinceEpoch = time.time()
    except IOError:
            Print("Unable to get your system time!")

1.) لماذا time.time() إثارة IOError؟ بقدر ما أنا أعلم أنه من المستحيل أن وظيفة لرفع خطأ، فإنه يجب دائما إرجاع قيمة.

2.) ينبغي Print print.

و3) حتى لو لم time.time رفع استثناء IOError، كنت ابتلاع استثناء، والتي ربما لا تريد القيام به. السطر التالي يتطلب SecondsSinceEpoch أن تكون محددة، بحيث سيتم رفع مجرد استثناء آخر (أكثر مربكة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top