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日开始要求下个月是一个错误.
链接: