在Symfony/Angular项目中,我使用日期拾取器(Bootstrap日期拾取器)来选择日期。这给了我一个对象值,然后我想要发送给php进行持久化。
问题是有一个时间偏移给我错误的值在数据库中。
我在法语设置中,我已经在php.ini中定义了正确的时区。
- 在日期选择器中选择:
17/11/2016
翻译成Thu Nov 17 2016 00:00:00 GMT+0100 (CET)
- 但当我发送到php ajax调用:我有
2016-11-16T23:00:00.000Z
php一边 - 然后在我的Db与学说,日期时间字段包含:
2016-11-16 23:00:00
- 当我想要显示保存的值时,它自然会在日期选择器中给出:
16/11/2016
这实际上是如果我做console.log():{"date":"2016-11-16 23:00:00.000000","timezone_type":3,"timezone":"Europe/Paris"}
在这个过程中我没有使用任何转换。我确实尝试过"cast"js: start.toUTCString()
,我也尝试过在php: $start.setTime(0, 0, 0);
中设置时间为0,但没有成功。
那么,如何保存和显示正确的日期呢?
这是我提示:
使用时间戳时,请使用epoch时间戳。epoch时间戳(unix时间戳)从Jan 01st 1970
开始,以秒为单位计算(大多数情况下)。例如今天是(2016年11月16日):
1479307079 seconds since Jan 01 1970. (UTC)
现在你可以将该值保存到数据库或对象中,你可以将其传递给JavaScript或返回给PHP,这取决于该值来自何处。
要显示正确的时间,你可以而且应该使用momentJS,只要你是在JavaScript环境中。
为什么momentJS ?
你不必担心时区,momentJS正在为你做这项工作:
moment().format(); // 2013-02-04T10:35:24-08:00
moment.utc().format(); // 2013-02-04T18:35:24+00:00
您可以将unix时间戳(秒或毫秒)解析为moment对象并使用它们:
let day = moment.unix(1318781876); // will display only the day
你也可以将当前日期转换为epoch时间戳,这样你就可以反过来保存用户输入的值,就像你的日期选择器一样。下面是momentJS的文档。
小心2038年的问题!
2038年问题是计算和数据存储情况下的问题,其中时间值被存储或计算为有符号32位整数,并且该数字被解释为从1970年1月1日00:00:00 UTC("epoch")开始的秒数。[…)
阅读更多:https://en.wikipedia.org/wiki/Year_2038_problem
简而言之:您可以安全地使用epoch时间戳,直到:
19th January 2038 03:14:07 UTC
希望对你有帮助。
问候,Megajin