Momentjs return 分钟操作后日期错误

Momentjs return wrong date after minutes manipulation

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

date_default_timezone_set('Europe/Rome');

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

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

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

而最初的结果是错误的:

Tue Mar 01 2016 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);

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>

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

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 对象实例。最后,我再次以我的时区格式传递输入值 re-formatted 日期,因为在操作中我丢失了以前的格式。最后的结果是我想要的。希望这有帮助,无论如何,如果有人找到比我更优化的解决方案,我会很高兴看到。

// 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'));

语言环境设置对于这段代码并不重要,因为您不使用任何 locale-specific 函数或格式说明符