【问题标题】:Momentjs return wrong date after minutes manipulation分钟操作后 Momentjs 返回错误的日期
【发布时间】:2016-01-03 09:35:53
【问题描述】:

在我的 php 应用程序中,我这样设置意大利时区:

date_default_timezone_set('Europe/Rome');

上面的字符串位于我的config.php 文件中,这是应用程序的核心。无论如何,从后端我使用momentjsCodeIgniter 框架。当用户从正确的输入中选择日期时,设置此结果:

现在我从这个输入中得到值,如下所示:

var end_date_temp = Date.parse($('#end-datetime').val());

而且最初的结果是错误的:

2016 年 3 月 1 日星期二 11:03:00 GMT+0100 (ora solare Europa occidentale)

剩下的代码是:

var end_date = moment(end_date_temp).add(serviceDuration, 'minutes').format('DD/MM/YYYY HH:mm');
$('#end-datetime').val(end_date);

注意:我也尝试设置moment.locale('it'),但出现了相同的结果,在我的 javascript 库中,我使用了 momentjs 的意大利时区。怎么了?

更新代码:

var end_date_temp = moment($('#end-datetime').val())._i;
var end_date = moment(moment(end_date_temp).add(serviceDuration, 'minutes')).format('DD/MM/YYYY HH:mm');
$('#end-datetime').val(end_date);

【问题讨论】:

  • 不要不要使用_i字段,也不要使用任何其他带有_前缀的字段。它们不适合外部消费。

标签: javascript php codeigniter date momentjs


【解决方案1】:
// parse the input string to a moment object, **specifying the input format**
var end_date = moment($('#end-datetime').val(), 'DD/MM/YYYY HH:mm');

// manipulate it as desired
end_date.add(serviceDuration, 'minutes');

// format it to the specified output format, and assign the result back to your field
$('#end-datetime').val(end_date.format('DD/MM/YYYY HH:mm'));

如果您愿意,可以在一行代码中完成此操作。

$('#end-datetime').val(moment($('#end-datetime').val(), 'DD/MM/YYYY HH:mm').add(serviceDuration, 'minutes').format('DD/MM/YYYY HH:mm'));

区域设置对于这段特定的代码并不重要,因为您不使用任何特定于区域设置的函数或格式说明符

【讨论】:

  • 很好的解决方案 Matt,现在我感觉自己就像是开发者生活的最后一张照片:martinvalasek.com/blog/pictures-from-a-developers-life-part-2 有美好的一天,新年快乐!
  • 谢谢。你也是!
  • @Dillinger 所以我发布了完全相同的内容,而不是为你咀嚼,这不是一个有效的答案?
  • @ShanShan 我没有说这不是一个有效的答案,但就我而言,它不起作用,但是其他用户可能会发现我和马特的答案更好。我很抱歉。
【解决方案2】:

经过多次尝试,我固定在我的时区(意大利语),如下所示:

moment.locale('it');

var end_date_temp = moment($('#end-datetime').val()).format('DD/MM/YYYY HH:mm')
var end_date = moment(end_date_temp).add(30, 'minutes');
$('#end-datetime').val(moment(moment(end_date).toDate()).format('DD/MM/YYYY HH:mm'));

我将.locale 声明为it,下次我也会在我的时区中格式化从输入文本返回的时间。我用.add 方法处理了日期,为此我创建了另一个momentjs 对象实例。最后,我从输入中传递值,再次以我的时区格式重新格式化日期,因为在操作中我丢失了以前的格式。最后的结果就是我想要的。无论如何,希望这能有所帮助,如果有人找到比我更优化的解决方案,我会很高兴看到。

【讨论】:

【解决方案3】:

momentjs 使用美国日期格式 (MM/DD/YYYY),强制使用格式来获​​取正确的日期:

var input = '03/01/2016 11:00';
var date = moment(input, 'DD/MM/YYYY HH:mm');

document.write(date);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.0/moment.min.js"></script>

【讨论】:

  • 我已经在使用 .format('DD/MM/YYYY hh:mm');但正如我上面解释的那样,最终日期不正确..
  • format() 用于将日期作为字符串返回。要正确解析输入,您必须将格式作为moment() 的第二个参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多