Javascript到PHP的日期转换在时区中丢失.也许mysql保存问题


javascript to php date conversion lost in timezone. Maybe mysql saving issue?

在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.000Zphp一边
  • 然后在我的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