【问题标题】:Check to see if date is valid somewhere in the world检查日期是否在世界某处有效
【发布时间】:2017-10-09 15:21:21
【问题描述】:

如何检查给定的时间戳是否仍然存在于全球某处?

例如,假设我的时间戳类似于 2017 年 5 月 10 日下午 3:49。今天世界上有没有哪个地方是 2017 年 5 月 10 日下午 3:49?

【问题讨论】:

  • 你对这个计算有语言偏好吗?
  • 最好是python。
  • 当您说“地球上的某个地方”时,您是指某处有人居住吗?或者只是在某个定义了 tzdb 时区标识符的地方?这些不一定是相同的东西。您需要知道在哪里和/或哪个时区 ID?

标签: python date timezone timestamp


【解决方案1】:

检查时间戳是否在 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

&lt;script src="//repl.it/embed/IRoE/6.js"&gt;&lt;/script&gt;

注意,检查之间应该是一个包容性。但是由于从生成时间戳到检查其有效性所花费的时间,时间戳几乎不在最新时区的边缘情况可能会出现错误。

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

&lt;script src="//repl.it/embed/IRoE/8.js"&gt;&lt;/script&gt;

【讨论】:

    【解决方案2】:

    使用与 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))
    

    【讨论】:

      【解决方案3】:

      您可以通过将所有时区的当前时间与提供的时间进行比较来进行检查。

      这里有一个函数可以为你做到这一点:

      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 维基百科文章。

      【讨论】:

      • 感谢您的尝试,但您的功能几乎是正确的。我想解决方案是将输入时间(t)与地球上可能的最短时间(UTC-12)进行比较。然后,如果t 大于或等于datetime.datetime.utcnow(),则 t 必然有效 :) 这也将消除循环的需要。
      • 啊。我一定是误读了它,因为地球上的某个地方必须有时间 t,而不是 t 在今天某个时候有效。
      猜你喜欢
      • 2017-02-28
      • 2012-03-15
      • 1970-01-01
      • 2020-01-24
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      相关资源
      最近更新 更多