2017-05-10 20 views
3

特定のタイムスタンプが地球のどこかにまだ保持されているかどうかをどのように確認できますか?日付が世界のどこかで有効かどうか確認してください

たとえば、私は2017年5月10日3:49 pmに似たタイムスタンプを持っているとします。 2017年5月10日の午後3時49分は今日、世界にはどこの場所がありますか?

+0

あなたはこの計算のための言語設定を持っていますか? –

+0

好ましくはpython。 – leco

+8

「地球のどこか」と言えば、人が住む場所*を意味しますか?または、定義されたtzdbタイムゾーン識別子を持つどこかで?これらは必ずしも同じものではありません。あなたはどこで、そして/またはどのタイムゾーンIDを知る必要がありますか? –

答えて

3

タイムスタンプがUTC + 14とUTC-12の間にあるかどうかをチェックします。

from datetime import datetime, timedelta 

def is_a_today_somewhere(timestamp): 
    now = datetime.now() 
    latest = now + timedelta(hours=-12) 
    earliest = now + timedelta(hours=14) 
    return latest <= datetime.fromtimestamp(timestamp) <= earliest 

now = datetime.now()      # now 
timestamp = datetime.timestamp(now) 
print(is_a_today_somewhere(timestamp))  # prints True 

now = datetime.now() + timedelta(hours=7) # +7 hours from now 
timestamp = datetime.timestamp(now) 
print(is_a_today_somewhere(timestamp))  # prints True 

now = datetime.now() + timedelta(hours=-23) # -23 hours from now 
timestamp = datetime.timestamp(now) 
print(is_a_today_somewhere(timestamp))  # prints False 

<script src="//repl.it/embed/IRoE/6.js"></script>

チェックは間の包括的でなければならないことに注意してください。しかし、タイムスタンプの生成から妥当性をチェックするまでにかかる時間のために、タイムスタンプが最新のタイムゾーンにほとんど存在しない場合は、誤っている可能性があります。

from datetime import datetime, timedelta 

def is_a_today_somewhere(timestamp): 
    now = datetime.now() 
    latest = now + timedelta(hours=-12) 
    earliest = now + timedelta(hours=14) 
    return latest <= datetime.fromtimestamp(timestamp) <= earliest 

now = datetime.now() + timedelta(hours=-12) # -12 hours from now; barely in today 
timestamp = datetime.timestamp(now) 
print(is_a_today_somewhere(timestamp))  # May print False 

<script src="//repl.it/embed/IRoE/8.js"></script>

5

すべてのタイムゾーンの現在の時刻と提供された時刻を比較することで確認できます。

import datetime 
deviations_from_utc = (-12, -11, -10, -9.5, -9, -8, -7, -6, -5, 
        -4, -3.5, -3, -2, -1, 0, 1, 2, 3, 3.5, 4, 4.5, 5, 
        5.5, 5.75, 6, 6.5, 7, 8, 8.5, 8.75, 9, 9.5, 10, 
        10.5, 11, 12 , 12.75, 13, 14) 
def is_current(t): 
    n = datetime.datetime.utcnow() 
    provided_time = (t.year, t.month, t.day, t.hour, t.minute) 
    for time in deviations_from_utc: 
     at = n + datetime.timedelta(hours=time) 
     at_time = (at.year, at.month, at.day, at.hour, at.minute) 
     if provided_time == at_time: 
      return True 
    return False 

deviations_from_utcが使用されているUTC時間からの偏差の全てが含まれています。ここでは

はあなたのためにそれを行うだろう機能です。リストは thisウィキペディアの記事から取られました。

+1

あなたの試みに感謝しますが、あなたの機能はほぼ正しくなっています。私は、入力時間( 't')と地球上でできるだけ短い時間(UTC-12)を比較することが解決策であると考えています。次に、 't'が' datetime.datetime.utcnow() '以上であれば、tは必ず有効です。 これはループの必要もなくなります。 – leco

+0

ああ。私は、地球上のいくつかの場所が時間tを持たなければならないので、間違っているはずです。 –

1

UTCからの標準偏差、つまり最大+14と最小-12を使用すると、タイムスタンプを比較し、タイムスタンプが最大値と最小値の間にあるかどうかを確認できます。

from datetime import datetime 


def is_valid_time(search_timestamp): 
    utc_timestamp = datetime.timestamp(datetime.utcnow()) 
    max_timestamp = utc_timestamp + (14*60*60) # max time is utc+14 
    min_timestamp = utc_timestamp - (12*60*60) # min time is utc-12 

    # check if time in range 
    if min_timestamp <= search_timestamp <= max_timestamp: 
     return True 
    return False 

# Test cases 
now = datetime.timestamp(datetime.now()) 
# false 
print(is_valid_time(3)) 

# false 
print(is_valid_time(now + (16*60*60))) 

# true 
print(is_valid_time(now)) 
関連する問題