質問

システムtime_tを取得し、それを人間が読める日付/時刻に変換するための時間コンバーターを作成しています。ああ、これは私の2番目のpythonスクリプトです。その事実は別として、先に進みます。

完全なスクリプトはこちらでホストされています。

年と月のコンバーターの作成は非常に簡単でしたが、1日を機能させようとする深刻な障害に直面しました。ご覧のとおり、私は1970年から今日までずっと自分のやり方で総当たり攻撃を試みてきました。残念ながら、その日は-105と表示されます。

それを行うより良い方法、または私がここで試みたことを修正する方法を知っている人はいますか?現在は午前3時30分であるため、明らかな何かを見逃している可能性があります。

申し訳ありませんが、Pythonを学習するためにこれを手動で行っていることに注意するのを忘れました。残念ながら、日付関数を介してそれを行うと、目的が無効になります。

役に立ちましたか?

解決

(Pythonを学習するためにこれを行うと仮定しているため、コード内のエラーを指摘します)。

>>> years = SecondsSinceEpoch / 31540000

ノノノノ。それはできません。ある年には31536000秒、他の年には31622400秒があります。

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

真の値が真であるかどうかをテストする必要はありません。 :-)実行:

>>> if calendar.isleap(yeariterator):

代わりに。

変更:

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

宛先:

  
    
      

範囲内のyeariteratorの場合(1970、yearsforday関数):

    
  

これによりエラーも修正されます。2009年以降まで停止しないため、年の残りの日数は105日であるため、答え-105が返されます。

また、月ごとの計算にはあまり意味がありません。年々うまくいきます。

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

そして、8つのスペースのインデントはたくさんあります。 4がより一般的です。

また、年と日を2回ではなく1つの方法で計算します。

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'))

datetimeモジュールは、うるう年、うるう秒、うるう日、およびタイムゾーン変換(オプションの2番目の引数を使用)のすべてのエッジケースを処理します

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