- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
考虑这段代码,我们要在其中增加或减少一秒:
date_default_timezone_set("Europe/Amsterdam");
$time = 1477789199;
echo $time . ' - ' . date('r', $time) . "\n";
// 1477789199 - Sun, 30 Oct 2016 02:59:59 +0200
这是正确的,因为这个时间戳仍然在 DST(夏令时/夏令时)之内。
但现在让我们将时间戳整数加一秒,然后退出 DST:
$new = $time + 1;
echo $new . ' - ' . date('r', $new);
// 1477789200 - Sun, 30 Oct 2016 02:00:00 +0100
万岁! PHP 发现一秒钟后不再有 DST,并显示正确的时间字符串。
但是,如果我们不向时间戳整数添加一秒,而是使用 strtotime()
添加一秒会怎样:
$new = strtotime('+1 second', $time);
echo $new . ' - ' . date('r', $new);
// 1477792800 - Sun, 30 Oct 2016 03:00:00 +0100
哎呀!我们只是提前了一个多小时而不是一秒钟。如果你增加一秒钟、一小时、一天或一年,你总是会多一个小时,这并不重要。即使您添加多个年份,您也只会多获得一个小时,这很奇怪,因为我们每年都会进入和退出夏令时,但无论您添加多少年,您都只会多获得一个小时
但是一旦我们在 10 月退出 DST 并减去一秒,一切都会好起来...
不过话又说回来了。如果我们在三月,刚进入夏令时,我们减去一秒,我们观察到完全相同的反向。
等等,什么?!那么……?
echo strtotime('+ 1 second - 1 second', 1477789199); // echoes 1477792799
哇...
对我来说,这听起来像是一个错误。或者这是“设计使然”?有谁知道这是否记录在某处,或者是否需要报告?
最佳答案
该行为“有据可查”......在测试中:
参见 https://bugs.php.net/bug.php?id=30532 (它也按预期显示您的预期结果)和相关的测试文件(断言当前行为是正确的)https://github.com/php/php-src/blob/master/ext/date/tests/bug30532.phpt
<?php date_default_timezone_set("America/New_York");
echo date('Y-m-d H:i:s T', strtotime('2004-10-31 EDT +1 hour'))."\n";
echo date('Y-m-d H:i:s T', strtotime('2004-10-31 EDT +2 hours'))."\n";
echo date('Y-m-d H:i:s T', strtotime('2004-10-31 EDT +3 hours'))."\n";
/* 2004-10-31 01:00:00 EDT
2004-10-31 01:00:00 EST
2004-10-31 02:00:00 EST */
echo date('Y-m-d H:i:s T', strtotime('2004-10-31 +1 hour'))."\n";
echo date('Y-m-d H:i:s T', strtotime('2004-10-31 +2 hours'))."\n";
echo date('Y-m-d H:i:s T', strtotime('2004-10-31 +3 hours'))."\n";
/* 2004-10-31 01:00:00 EDT
2004-10-31 02:00:00 EST
2004-10-31 03:00:00 EST */
请注意,在前一种情况下,时区(此处:EDT
)被直接传递给字符串,而在后一种情况下则不是。
通常 strtotime
正在使用时间戳(即 2004-10-31
- 或者在您的特定情况下:传递的时间戳),转换为具有个人的表示参数,忽略 DST(即个别小时、分钟、秒、日、月、年等),对其应用操作,然后转换回时间戳。
特别是:
echo date('r', strtotime('+ 0 second', 1477789199));
#> Sun, 30 Oct 2016 02:59:59 +0100
strtotime()
在转换后抛出时区,即只需要
Sun, 30 Oct 2016 02:59:59
然后将主要适用时区应用到您的时区位置(即 Europe/Amsterdam
),以 CET
(主要!)- CEST
结尾code> 也是可以的,但只是第二选择。
现在,回顾上面的测试,只需明确指定原始时区即可。
因此,如果您希望它按您需要的方式运行:
echo date('r', strtotime('CEST', 1477789199));
#> Sun, 30 Oct 2016 02:59:59 +0200
echo date('r', strtotime('CEST + 1 second', 1477789199));
#> Sun, 30 Oct 2016 02:00:00 +0100
事实上,在 'CEST '
之前添加任何时候都没有问题(因为如果 CEST
不是,它将始终回退到 CET
匹配并且 CET
-> CEST
转换没有重叠)。
关于php - strtotime() 有错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39622216/
在 PHP 中对 strtotime() 进行了一番研究之后,我注意到当您传入空格和/或点时,它会返回一个有效的时间戳。 var_dump(strtotime(" ")); var_dump(strt
这是我的代码: $testtime = str_replace('.', '-', '2009.07.08 17:01'); $timestamp = strtotime($testtime); ec
我有一个脚本,它从 excel 表中读取值并将它们插入到 sql 表中。我的问题是当脚本读取某些日期字段时,它会将它们设置为默认值:1970-01-01 01:00:00 我注意到当遇到“天”大于 1
我有 2 台服务器。他们都使用相同的操作系统:Ubuntu 14.04 服务器 + php-fpm。我不能让它们生成相同的 strtotime结果。 日期时间:2013-12-30 18:29:59第
我使用 ths 方法来查找两个时间戳之间的差异并获取这两个时间之间的秒数,然后像计数器一样用 jquery 刷新信息。 $diff = strtotime(date('Y-m-d H:i:s')) -
我正在构建一个日记,其中包含每周 View ,我认为我已经破解了,因为日期似乎是正确的。直到我的 MySQL 查询不断返回看似随机的结果,我才意识到这个月实际上被视为一天。 $week_number
date('m/d/Y', strtotime('-1.5 years')) 返回今天(2012 年 6 月 18 日),06/18/2017。 这是为什么,有没有办法让 strtotime 处理小数
有没有办法转换strtotime与 NSDate 类似的字符串(例如:给定日期的“-3 天”)? 最佳答案 参见 NSDate 的 +dateWithNaturalLanguageString: 。我
我遇到了一个奇怪的问题。当我执行 strtotime 时,它不会考虑原始日期的小时部分,并且它总是在午夜返回。我尝试进行研究,但找不到任何具体内容。 我有什么遗漏吗? $original_date
我有一些 php 可以更改从数据库检索的时间格式: $selectedDate = $_GET['date']; $formatedDate = date("Y-d-m",strtotime($sel
我愿意 strtotime("2008-09-04") 其中 09 是月份,04 是日期,我得到的结果是: 1220500800 2008 年 9 月 4 日星期四 04:00:00 GMT。这 4
我正在使用 strtotime($my_time); 创建我在 php 数学中使用的时间戳。 变量$my_time 是从数据库中提取的HH:mm:ss 24h 格式。 我正在设置时间,但我不知道生产日
任何人都可以向我解释这个例子中的 strtotime 函数有什么问题?我正在尝试计算日期之间的差异。 PHP 5.6.0 (cli)(内置:2014 年 8 月 28 日 08:03:51)当我执行这
我正在根据用户输入的日期、月份和年份值构建时间戳。 假设用户输入了一些错误的值并且日期是不存在的“31-02-2012”,那么我必须得到一个错误的返回。但这里将其转换为附近的另一个日期。精确到:“02
这个问题在这里已经有了答案: php strtotime() messes with date of a different year (1 个回答) 关闭 9 年前。 我正在尝试使用 pickad
我有一些 php 可以更改从数据库检索的时间格式: $selectedDate = $_GET['date']; $formatedDate = date("Y-d-m",strtotime($sel
我愿意 strtotime("2008-09-04") 其中 09 是月份,04 是日期,我得到的结果是: 1220500800 2008 年 9 月 4 日星期四 04:00:00 GMT。这 4
我正在尝试使用 strtotime 转换以下日期: 07/09/2009 17:01:27 这是 9 月 7 日的欧洲/伦敦时区格式 该功能正在反转月份和日期,有什么解决方法吗? 谢谢 最佳答案 更改
我有一个循环,其中日期以不同的格式出现,例如对于某些值,它会像 '10-13-2013 04:31' ,对于某些值,它会像 >'2013-10-14T22:14:40-0700'。我尝试将其存储在数据
嗨,我有一个查询,它从数据库中选择 `timestamp` >= '".$monS."' AND `timestamp` < '".$sunE."' 以下是 $monS 和 $sunE 的定义方式:
我是一名优秀的程序员,十分优秀!