Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.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 弹出式日历显示本地日期,但所选日期为UTC_Javascript_Angularjs_Angular Ui Bootstrap - Fatal编程技术网

Javascript 弹出式日历显示本地日期,但所选日期为UTC

Javascript 弹出式日历显示本地日期,但所选日期为UTC,javascript,angularjs,angular-ui-bootstrap,Javascript,Angularjs,Angular Ui Bootstrap,我想以UTC格式保存所选日期 但是弹出式日历与所选日期时间不同步 假设我点击08/13,选择的日期是08/12 因为在我的时区是08/13,但它仍然是08/12与UTC时区 HTML 如果您将其存储为UTC,为什么将其保留为UTC会有问题?。如果您想将时间从UTC更改为另一个时区,您可以使用力矩进行角度调整。但你们必须给这个时刻一个转换的时区。例如: function utctoTimeZoneFormat(date, current_tz) { var offse

我想以UTC格式保存所选日期

但是弹出式日历与所选日期时间不同步

假设我点击08/13,选择的日期是08/12

因为在我的时区是08/13,但它仍然是08/12与UTC时区

HTML
如果您将其存储为UTC,为什么将其保留为UTC会有问题?。如果您想将时间从UTC更改为另一个时区,您可以使用力矩进行角度调整。但你们必须给这个时刻一个转换的时区。例如:

function utctoTimeZoneFormat(date, current_tz) {

            var offset = moment(date).tz(current_tz).utcOffset();
            var returnObj = {
                "day": "",
                "time": ""
            }
            returnObj.day = moment.utc(date).tz(current_tz).utcOffset(offset).format('dddd');
            returnObj.time = moment.utc(date).tz(current_tz).utcOffset(offset).format('HH:mm:ss')

            return returnObj;
        }
您可以将date参数作为您从UI中选择的日期传递,将current_tz作为您的时区传递。但你必须像“美国/洛杉矶”一样通过时区名称

function timeZoneToUTCFormat(date, current_tz) {

            var offset = moment(date).tz(current_tz).utcOffset();
            offset = offset * -1;
            var returnObj = {
                "day": "",
                "time": ""
            }
            returnObj.day = moment.utc(date).tz(current_tz).utcOffset(offset).format('dddd');
            returnObj.time = moment.utc(date).tz(current_tz).utcOffset(offset).format('HH:mm:ss')

            return returnObj;
        }

第二个功能使您能够将所选日期存储为UTC。您应该相应地传递参数。例如如果您在“America/Los_Angeles”,则应将时区作为给定字符串传递,并将其转换为UTC。因此,您可以使用上面编写的两个函数同步UI和后端。

在较新版本的UI datepicker中,有一种更简单的方法可以解决此问题

   ng-modal-options='{"timezone":"utc"}'
这将从日期中删除时区组件

在旧版本中

解决方案是删除日期部分的时区组件(最好有可重用性指令

myapp.directive("dateToIso", function () {   
    var linkFunction = function (scope, element, attrs, ngModelCtrl) {

        ngModelCtrl.$parsers.push(function (datepickerValue) {
            return moment(datepickerValue).format("YYYY-MM-DD");
        });
    };

    return {
        restrict: "A",
        require: "ngModel",
        link: linkFunction
    };
});
你可以像下面那样使用它

  <input ng-model='abc' date-to-iso ui-datepicker>


您正试图将选定的时间存储为UTC?首先,您应该确定计时器的时区,然后您可以使用“时刻”或其他方式将其存储为UTC。但要回答您的问题,您应该提供有关问题的明确信息。@Fatihaktpe是的,无论用户单击什么,我都会将时间存储为UTC。我知道这是不寻常的。但这只是我的用例。谢谢。@user3675188这似乎是个错误。似乎有一个解决办法;只是吹毛求疵,UTC不是时区。UTC是一种标准格式,默认使用GMT时区。您可以通过给它正确的时区来表示UTC的本地时间。弹出的日历显示用户的时间区域不是utc。例如,如果我将操作系统上的时区从-8更改为+8,弹出的时区将完全不同。比方说,如果我在弹出窗口上单击2016-08-10时我的区域位于+8,则所选日期可能是2016-08-09。我想使其同步如果弹出窗口显示用户时区,则您可以将所选日期存储为utc。要更新我的答案吗。如果答案解决了您的问题,请给我一个反馈。错误更正:应该是
ng model options='{“timezone”:“utc”}'
myapp.directive("dateToIso", function () {   
    var linkFunction = function (scope, element, attrs, ngModelCtrl) {

        ngModelCtrl.$parsers.push(function (datepickerValue) {
            return moment(datepickerValue).format("YYYY-MM-DD");
        });
    };

    return {
        restrict: "A",
        require: "ngModel",
        link: linkFunction
    };
});
  <input ng-model='abc' date-to-iso ui-datepicker>