日期/时间添加标准?

pre*_*mer 15 php mysql oracle standards datetime

我正在寻找添加日期/时间的标准.我找不到任何东西.特别是我希望找到一个规范来定义当你将一个月添加到1月31日这样的日期时会发生什么.2月28日(/ 29日)是正确答案吗?3月1日?3月2日?

我已经看到不同工具(在这种情况下是PHP和MySQL)之间的实现不一致,我正在尝试找到一些基于我工作的标准.

不同的结果:

PHP

$end = strtotime("+1 month", 1314835200);
//1317513600   Sat, 01 Oct 2011 20:00:00 -0400
Run Code Online (Sandbox Code Playgroud)

MySQL的

SELECT UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(1314835200), INTERVAL 1 MONTH));
#1317427200    Fri, 30 Sep 2011 20:00:00 -0400
Run Code Online (Sandbox Code Playgroud)

神谕

SELECT ADD_MONTHS('31-Aug-11', 1) FROM dual;
#30-SEP-11
Run Code Online (Sandbox Code Playgroud)

(抱歉格式改变,我的oracle foo很弱)

Java的

Calendar c = Calendar.getInstance();
c.clear();
c.set( 2011, Calendar.AUGUST, 31 );
c.add( Calendar.MONTH, 1 );
c.getTime()
#Fri Sep 30 00:00:00 EDT 2011
Run Code Online (Sandbox Code Playgroud)

der*_*ert 11

根据POSIX.1-2001标准,下个月(如在tm_mon调用前递增mktime)通过调整值直到它们适合来完成.因此,例如,2001年1月31日的下个月是2001年3月3日.这是因为tm_mday31 tm_mon对于1(2月)无效,因此它被标准化为tm_mon2(3月)和tm_mday3.

2000年1月31日的下个月是2000年3月2日,因为2月份当年有29天.从1月开始的下个月,1 2038年不存在,具体取决于.

关于标准的好处是有很多选择.检查SQL标准,我打赌你可以找到下个月的不同含义.我怀疑ISO 8601可能会给你另一个选择.重点是,有许多不同的行为,"下个月"的含义是特定于域的.

编辑:我我已经找到了SQL-92如何处理它,显然从1月31日开始要求下个月是一个错误.

链接:

  • 谢谢,它会出现(即使在赏金之后)问题没有在特定空间之外正式定义,这些空间记录了他们自己的解决方案.感谢您收集几个答案,以及为链接列表提交添加内容的所有人. (2认同)