Angular-Ui Bootstrap Popup DatePicker 的 ngModelOptions 的时区属性

one*_*ill 5 javascript timezone timezone-offset angularjs angular-ui-bootstrap

我们在应用程序中使用 Angular-Ui Bootstrap Popup DatePicker,并且遇到了诸如此类的问题:前一天被选择为用户实际选择的日期。

我们将选择器的日期设置为来自服务器 (json) 的 UTC。虽然 Javascript Date 对象是本地的,因此不匹配。

作为解决方案(显然),他们添加了一个 ngModelOptions 并且我看到它的用法如下:

var date = new Date()
$scope.timezone = ((date.getTimezoneOffset() / 60) * -100)
Run Code Online (Sandbox Code Playgroud)

带标记

<input type="date" 
    ng-model="dateModel" 
    ng-model-options="{timezone: timezone}" /> 
Run Code Online (Sandbox Code Playgroud)

但是该选择器的 doco 并没有真正解释它如何使用/消耗该时区属性。我能找到的最接近的解释是 ngModelOptions 本身的 doco,其中写道:

您可以通过在 timezone 属性中提供时区名称来指定日期/时间输入指令所需的时区。

我希望有人能够简要解释一下该选择器如何使用 ngModelOptions 指令的时区属性,以及我是否应该将其设置为 utc 或将浏览器偏移设置为 utc。

谢谢

Wil*_*lco 2

对于那些仍在使用 Angular-UI Bootstrap 并寻找答案的人:

您可以使用 ng-model 选项,例如ng-model-options="{timezone: 'UTC'}". 这将转换日期对象,使该时区的时间为 00:00。

如果没有此设置,dateModel 值将是浏览器当地时间的午夜。我的浏览器采用 BST (UTC+1),因此默认日期为:Sat May 07 2022 00:00:00 GMT+0100 (British Summer Time),如果然后使用调用,dateModel.toISOString()则会将其转换为“2022-05-06T23:00:00.000Z”。

要获取表示 UTC 午夜的日期对象,请设置选项,如下所示:

<input type="date" 
    ng-model="dateModel" 
    ng-model-options="{timezone: 'UTC'}" /> 
Run Code Online (Sandbox Code Playgroud)

现在,当我选择一个日期并在浏览器中查看它时,它显示为Sat May 07 2022 01:00:00 GMT+0100 (British Summer Time),因此调用dateModel.toISOString()会给出'2022-05-07T00:00:00.000Z'(这就是我发送到服务器的内容)。