Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript moment.js正在将输入时间更改为timezoone,而它';它应该已经是那个时区了_Javascript_Angularjs_Timezone_Momentjs - Fatal编程技术网

Javascript moment.js正在将输入时间更改为timezoone,而它';它应该已经是那个时区了

Javascript moment.js正在将输入时间更改为timezoone,而它';它应该已经是那个时区了,javascript,angularjs,timezone,momentjs,Javascript,Angularjs,Timezone,Momentjs,所以我试着用moment.js做一些时间转换,为了清晰起见,我用Angular做一些数据绑定 $scope.resolveTime = function () { var m = moment.tz($scope.inputTime, 'America/Los_Angeles'); $scope.inputTime = m; var zone = jstz.determine(); $scope.outputTime = m.tz(zone.name());

所以我试着用moment.js做一些时间转换,为了清晰起见,我用Angular做一些数据绑定

$scope.resolveTime = function () {

    var m = moment.tz($scope.inputTime, 'America/Los_Angeles');
    $scope.inputTime = m;
    var zone = jstz.determine();

    $scope.outputTime = m.tz(zone.name()); // Convert CDT to local time

    console.log("inputtime:  " + $scope.inputTime.format())
    console.log("local:  " + $scope.outputTime.format())
};
我认为这很简单,但我猜发生的是,当我通过输入时间并告诉它是
America/Los_Angeles
时,它会将当前本地时间转换为PDT,而不是设置为PDT,因为下面的代码将其转换回本地时区,从而使两个变量的数字完全相同。有人知道怎么避开这件事吗? 结果应该是用户输入一个时间(PDT),它将显示用户本地时间中的时间


更新:进一步研究后,我认为实际上是我的时间选择器将输入更改为一个日期对象,然后是本地的,我使用的时间选择器是Angular Ui Boostrap供参考

这可以变得更容易一些

首先,时刻是可变的。这就是为什么
$scope.inputTime
$scope.outputTime
具有相同的值。您可以使用
.clone()
克隆当前时刻来修复此问题

此外,要将日期输入用户的本地时间,您只需依赖浏览器中内置的行为和moment的
.local()
函数即可。没有必要去jstz查询用户的本地时间,除非你真的想知道他们的时区

值得注意的是,矩时区内置于jstz自0.5.0(2015年12月)起通过
矩.tz.guess()
提供的功能中

总而言之,您的代码应该如下所示:

function () {

var m = moment.tz($scope.inputTime, 'America/Los_Angeles');
$scope.inputTime = m;

$scope.outputTime = m.clone().local(); // Convert CDT to local time

console.log("inputtime:  " + $scope.inputTime.format())
console.log("local:  " + $scope.outputTime.format())
};

如果
$scope.inputTime
中已经有时区偏移量,则矩将首先使用它,然后转换为您指定的时区。在每个步骤之前和之后添加一些日志记录,这样您就可以准确地看到值是如何被修改的。这很有意义,谢谢,不过我刚刚尝试初始化
$scope.inputTime=矩.tz('America/Los_Angeles')当我记录它的时候,我仍然得到我的本地时间,但是我只是注意到它是以日期格式出现的,而不是时刻。我有一种感觉,它可能是角度的重新格式化,在进一步的检查中,我想它实际上可能是我的时间选择器在做这件事。我正在使用Angular UI Boostrap时间选择器,看起来我必须重新运行自己的时间选择器。这可能会有所帮助。它添加了一个自定义指令来修复日期。谢谢你的澄清,如果我可以的话,我真的很喜欢包含更少的js库。不过,这对我来说也行,只需要修复我的时间选择器,她很乐意去。如果你和你的约会选择器有关系,那么你就有关系了。如果您碰巧已经在项目中使用jquery/moment/boostrap,您可以查看Eonasdan/bootstrap datetimepicker。一切都是用一个时间而不是日期。我相信它支持去年9月的时区时刻。这将使您的代码更容易。