【问题标题】:How to use time > year 2038 on official Windows Python 2.5如何在官方 Windows Python 2.5 上使用时间 > 2038 年
【发布时间】:2010-10-24 19:05:58
【问题描述】:

Windows 上的官方 Python 2.5 是使用 Visual Studio.Net 2003 构建的,它使用 32 位 time_t。因此,当年份 > 2038 时,它只会给出例外情况。

虽然这在 Python 2.6 中已修复(在 VS2008 中将 time_t 更改为 64 位),但我想使用 2.5,因为已经为它编译了许多模块。

所以这是我的问题 - 是否有任何解决方案可以轻松让我的程序处理年份 > 2038 并仍在使用官方 Python 2.5?例如一些预制库,如"time64" 或“longtime”等...

请不要告诉我升级到 2.6+ 或忘记这个错误 - 我有理由需要让它工作,这就是我在这里发布问题的原因。

【问题讨论】:

  • 2038 年还有很长的路要走……别担心。 笑话
  • 人们在 80/90 年代曾经认为 2000 年有很长的路要走,这就是我们有 Y2K 错误的原因......
  • 将日期存储为字符串,例如:“20080122”。通过删除多余的零来优化它。这样就变成了:“8-12-2”。您知道现在是 2000 年,因此不需要 2。之后将其存储在 XML 文件中以便于访问:8122thu day-of-week> 如果您在整个应用程序中使用它,那么您将没有问题,也不需要内置日期类型。
  • 你指的是什么 Python 模块/函数/类?能给个代码示例吗?
  • @dalke:我认为答案很简单——如果你想修复一个大型系统的小错误,你不会想升级整个运行时解释器,这就是我的情况。例如,假设您正在维护一个 Web 服务站点(并且已经安装了许多扩展);一些用户告诉你时间没用,他们希望修复它,但你不想升级 python,因为更多的用户可能会因为升级而遇到麻烦。一切都是为了稳定和降低风险。

标签: python time python-2.5 time-t year2038


【解决方案1】:

标准库中的datetime 模块应该适合您。您需要 time 模块提供的 datetime 不提供的什么?

【讨论】:

  • 你试过约会时间吗? datetime 不基于 time_t,也不支持 time_t64(尝试 datetime.datetime.fromtimestamp(LARGE_NUMBER_HERE))
  • @Francis:我也使用日期时间。不基于 time_t 没有太大影响。使用日期时间有什么问题?有什么具体的错误或问题吗?
  • 是的。 datetime 没有帮助 - 如果我需要像 time.time() 这样的 time_t,将 Y2039 传递给 datetime 将失败,并显示消息“ValueError:timestamp out of range for platform time_t”。如果将系统时钟更改为 2039 年,调用 datetime.date.today() 也会失败,因为“ValueError: timestamp out of range for platform localtime() function”。所以,datetime 不会改变任何东西 - 它只是默认时间模块的包装器。
【解决方案2】:

我不想听起来老套,但为什么不呢:

  • 忘记 Python 2.5 的 Y2038 错误
  • 在 2038 年之前的某个时间点升级到 Python 2.6

编辑: 澄清一下:(我是认真的——我不是故意开玩笑的)

假设您可以在从现在到 2038 年之间的某个不确定时间将 Python 升级到 2.6(或更高版本)。也许在 2012 年。也许在 2015 年。也许在 2037 年。

如果您知道应用程序中 Python 时间戳变量之间的差异(我不是 Python 用户),那么这些方面似乎是需要考虑的重要方面:

  • 永久保存哪些数据
  • 如何使用 Python 2.6 恢复已持久化的 Python 2.5 时间戳变量(推测它会“做正确的事”)
  • 旧数据是否会以其持久形式存储足够长的时间以产生歧义(例如,考虑到 1950 年和 2049 年之间,“96”年是明确的,但如果该数据保留到 2230 年,则“96”年可能是 1996、2096 或 2196)

如果答案是有利的,只需使用带有 2038 错误的常规时间戳即可。您必须将其与为使您的应用程序使用备用时间戳(例如数据库时间戳字符串或其他)而必须进行的重新设计/重构量进行比较。

【讨论】:

  • python 2.6 正在使用 vc8 并排运行时,所以我现在不想更改它(许多模块会失败)。
  • +1:在 Outlook 日历中添加 2037 年 7 月的注释以进行升级。
  • 为什么会有这么多的冷嘲热讽?也许应用程序实际上需要表示 2038 年今天之后的日期。我不知道,也许它是一个地质数据应用程序,需要将预测与长期日期或其他东西联系起来。
  • 我不是说现在升级到 2.6... 我的意思是将来当你准备好这样做时。即将编辑。
  • 好的,看看我的编辑。在我看来(我不知道你的应用程序)当你足够担心 Y2038 错误时,你已经将 Python 升级到了比 2.5 版更新的东西,在这种情况下持久数据记录是唯一的担心。
【解决方案3】:

我找到的最佳解决方案是获取 Python 2.5 的源代码副本,并使用默认 time_t 为 64 位的编译器重新编译 time 模块,例如 VS2005 或 VS2008(也可以配置 C 运行时以防止并排问题)。

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多