PHP:如果另一个应用程序假定的截止日期不是“1969”,如何解析两位数的年份? [关闭]

Posted

技术标签:

【中文标题】PHP:如果另一个应用程序假定的截止日期不是“1969”,如何解析两位数的年份? [关闭]【英文标题】:PHP: How to parse a two-digit year if the cutoff-date assumed by the other application ISN'T "1969?" [closed] 【发布时间】:2020-01-02 18:15:19 【问题描述】:

我们正在处理使用两位数年份存储日期值的旧式(AS/400、RPG)数据库。不久前做出的决定是“任何一年> = 20”是19xx ... (是的,他们现在玩得很开心,公司成立于1920年代后期所以实际上他们的押韵是有原因的。)

我看到 php 使用 1969 年的截止日期,因此日期始终假定为“1970-2069”。

但是......如果我想改变它怎么办?如果我想在我的应用程序中逐个更改,该怎么办?我应该如何去做这样的事情?我真的在寻找一种解决方案,它基本上会告诉 PHP 使用不同的截止日期,并且可能会更改在该日期的任一侧完成计算的方式?

当然我们知道那些旧的应用程序将不得不被重新设计并且数据库在日期值的表示上发生了变化,但这并不像看起来那么容易。我们需要可以最大限度地减少必须物理更改的 PHP 端代码量的想法。因此,如果您过去曾直接处理过这样的问题,我很想听听您的决定。

【问题讨论】:

你遇到了一个不可能的问题,类似于千年虫问题。现在是 2020 年,您将开始使用 year = 20 表示 2020 年的日期,并且无法将它们与 1920 年区分开来。 您实际上是否有现有记录,年份 = 20? 您可以判断的唯一方法是您是否有更多信息,可能是您可以加入的自动增量列,以限制 2020 年之前的日期。如果这些数据对您的雇主很重要,您会想知道他们为什么要等这么久才能升级这样一个遗留系统。 我们不是在 20 年零 3 天前解决了千年虫吗? Alex:“非常有趣的问题!”现在,他们将日期提前几年作为权宜之计。打败我为什么他们要等到元旦才知道,但我们到了。显然,我们并不完全确定 =PHP= 应用程序实际上会受到影响,因为它们当然是最近的,但是有“一些关键任务报告”非常关键,以至于“我们必须有一个答案” 如果只是“以防万一!” 【参考方案1】:

我认为没有任何内置解决方案。

你要做的是正常解析日期,然后检查结果的年份是否在 2020 到 2069 之间。如果是,从日期中减去 100 年,得到 1920 到 1969 之间的日期。

当然,这意味着在您将其重新格式化为使用 4 位数年份之前,您将无法在数据库中找到任何实际在 2019 年之后的日期。这是公司应该在 20 多年前做的事情,当时每个人都在为 Y2K 危机着迷。

【讨论】:

是的,缅族,“我们记得很清楚。”我们确实可以编写函数来撕开日期,挤进一个四位数的版本,然后翻译它。我要问的问题或多或少是“从管理之神那里下来的”。他们想知道 PHP 的 =default= 两位数日期处理是否可以更改,如果可以,如何更改。 我在回答的第一行就回答了这个问题。 AFAIK,日期解析不可配置。【参考方案2】:

如果你不想重新编译 PHP,答案是你不能。

您可以做的是使用正则表达式,例如 preg_replace_callback('~<regex here>~', function($matches) <return modified match here> , $str); 将日期预处理为 4 个字符的年份格式,然后以规范的日期时间格式解析/存储它。

【讨论】:

这或多或少是我预期的答案。

以上是关于PHP:如果另一个应用程序假定的截止日期不是“1969”,如何解析两位数的年份? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

第二阶段冲刺6

基于日期范围连接表

截止日期

超过上下文截止日期 - 普罗米修斯

检查日期是不是在另一个数据框中的两个日期之间,如果是则操作日期

如何在PHP中将多维数组过滤到另一个?