【问题标题】:Failed to parse time string ... : Double timezone specification无法解析时间字符串...:双时区规范
【发布时间】:2015-08-20 13:47:20
【问题描述】:

我有一个返回日期/时间值的表单。这是相关位的代码(它是网站使用的 Knockout JS 中的 javascript 代码,以及使用 Symfony 进行验证的 Propel 以及用于日期格式的 MomentJS):

self.startDate = ko.computed(function() {
  var startDate = moment(self.timesheetDate() + " " + self.startTime());

  return startDate.format("YYYY-MM-DD HH:mm");
}, self);

console.log(self.startDate()); // returns '2015-08-20 14:00'

不幸的是,在提交表单时,它返回了这个错误:

致命错误:未捕获的异常 'Exception' 带有消息“DateTime::__construct(): 无法在位置 0 (s) 解析时间字符串 (startdate): 在 C:\ 中的数据库中找不到时区” wamp\www\iq\vendor\symfony\validator\Constraints\AbstractComparisonValidator.php 第 53 行

我尝试将值作为 JavaScript Date 对象传递:

self.startDate = ko.computed(function() {
  var startDate = moment(self.timesheetDate() + " " + self.startTime());

  return new Date(startDate.format("YYYY-MM-DD HH:mm"));
}, self);

console.log(self.startDate()); // returns 'Thu Aug 20 2015 14:00:00 GMT+0100 (GMT Daylight Time)'

但是得到这个错误:

致命错误:未捕获的异常 'Exception' 带有消息 'DateTime::__construct(): 无法在位置 39 (D ):C:\wamp\www\iq\vendor\propel\propel\src\Propel\Runtime\Util\PropelDateTime.php 第 96 行中的双时区规范

所有包都是最新的。

有人知道如何解决这个问题吗?

提前谢谢你。

编辑:我尝试使用以下方法对日期进行硬编码:

$timesheet->setStartDate(date_format(date_create('2015-08-08 11:10:00'), 'Y-m-d H:i:s'));

但这没有帮助。以下是表单创建失败后 print_r 返回的内容:

DateTime 对象([date] => 2015-08-08 11:10:00 [timezone_type] => 3 [timezone] => Europe/London)

这似乎是正确的?所以我真的不知道为什么我会收到错误。

【问题讨论】:

  • 您的后端期望什么格式?您是否尝试过使用 ISO 8601 日期格式? startDate.format() 将以 iso 格式返回日期
  • @AnishPatel 它期待'Y-m-d H:i:s'
  • 您正在使用YYYY-MM-DD HH:mm,它缺少秒数。此外,第一个异常表明需要时区,请在格式字符串中使用 Z。尝试YYYY-MM-DD HH:mm:ssZ,或者尝试我的第一个使用 ISO 格式的建议,我看不到标准日期时间库无法识别 ISO 日期。
  • @AnishPatel 试图这样做但无济于事。这是 print_r 在尝试提交表单后返回的内容,如果它有帮助的话:[startdate:protected] => DateTime Object ( [date] => 2015-08-20 16:00:00 [timezone_type] => 1 [timezone] => +01:00 ) [enddate:protected] => DateTime Object ( [date] => 2015-08-20 16:45:00 [timezone_type] => 1 [timezone] => +01:00 )
  • 你试过new Date(startDate.format("YYYY-MM-DD HH:mm")).toISOString()吗?

标签: javascript php symfony datetime knockout.js


【解决方案1】:

找出问题所在。基本上在 Propel 架构上有一个验证行为:

<behavior name="validate">
...
<parameter name="rule3" value="{column: enddate, validator: GreaterThan, options: {value: StartDate, message: End date is required}}" />
</behavior>

它传递的是字符串“StartDate”而不是实际值。删除它解决了这个问题。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 2019-11-08
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多