【问题标题】:PrimeNG Calendar <p-calendar> - How to disable UTC - Z timezonePrimeNG 日历 <p-calendar> - 如何禁用 UTC - Z 时区
【发布时间】:2019-02-19 10:33:03
【问题描述】:

有谁知道是否可以禁用日期/时间选择器自动将 UTC 时间添加到日期对象?正如您在下图中看到的那样,它会自动将我的日期对象调整为 UTC。我希望我的日期对象在 10:00:00 提交

{"reportedDate": "2019-02-13T15:00:16.000Z"}


<p-calendar required [(ngModel)]="entry.reportedDate" name="reportedDate" #reportedDate="ngModel" [showIcon]="true" [showTime]="true" dateFormat="mm/dd/y 'EST'" hourFormat="24"></p-calendar>

【问题讨论】:

  • 它可能只是一个 Date 对象,在 javascript 中,当您将日期转换为字符串时,它始终采用该格式。你为什么想要另一个代表?您能否详细说明您如何使用该价值以及为什么这是一个问题?
  • 我有多个用户在不同的时区使用此表单,我想在提交和报告问题时使用一个标准时区 (EST)。因此,当用户提交表单时,我不希望日期对象根据用户的浏览器/计算机而改变,而是严格遵守日期选择器中选择的日期。

标签: angular date primeng


【解决方案1】:

根据the documentation page for this component(在属性表中):

Name        Type      Default    Description
-----------------------------------------------------------------------------
dataType    string    date       Type of the value to write back to ngModel,
                                 default is date and alternative is string.

你应该通过[dataType]="string"。这将阻止构造 Date 对象,进而阻止任何时区转换。

另外,我建议不要在条目的格式中加入时区缩写。请记住,夏令时可能会根据所选日期生效,而且并非每个时区都有清晰一致的缩写,并且某些缩写(例如 CST 或 IST)是不明确的。

如果您需要向用户表明该条目是美国东部时间,则将其放在文本框之外的某个位置。如果您必须使用缩写,请使用ET 作为通用形式。

【讨论】:

  • 感谢 Matt 提供的解决方案。我认为它应该用作&lt;p-calendar dataType="string" ... &gt;&lt;/p-calendar&gt;,而dataType周围没有[],因为我们不需要在这里评估“字符串”。
  • 这对我不起作用,请您提供更多上下文
  • 这对我有帮助,prime ng 版本是 6 和 angular 6。
【解决方案2】:

使用偏移量将日期格式化为您想要的时区。

*编辑 不好的例子(不要这样做):

var dt = new Date(1458619200000);
console.log(dt); // Gives Tue Mar 22 2016 09:30:00 GMT+0530 (IST)

dt.setTime(dt.getTime()+dt.getTimezoneOffset()*60*1000);
console.log(dt); // Gives Tue Mar 22 2016 04:00:00 GMT+0530 (IST)

var offset = -300; //Timezone offset for EST in minutes.
var estDate = new Date(dt.getTime() + offset*60*1000);
console.log(estDate); //Gives Mon Mar 21 2016 23:00:00 GMT+0530 (IST)

来自经验: 我不知道你是如何存储这个日期的。当您谈论时区时,事情很快就会变得复杂。稍后当您确实想要支持显示不同的时区时。然后,您必须在客户端设备上从东部前往中部。您在数据库中的所有条目都是东部时间,并且后端需要转换。您的服务器现在托管在不同的时区中,您需要在每个服务调用中自定义逻辑(噩梦!!!)

现在帮自己一个忙,以 UTC 保存所有内容。

【讨论】:

  • 感谢您的回复,但这并不是对所提问题的真正答案。此外,这里描述的方法经常被引用,但存在缺陷。 1) 在上面的第 3 行,您已经在使用基于 UTC 的时间戳,因此通过本地偏移对其进行调整是不正确的。 2) 在上面的第 5 行,您假设时间戳总是需要在 EST (UTC-5) 中,但根据 DST 是否生效,它可能需要是 EDT (EST-4) - 这是确实是给出的示例日期的情况。
  • 3) 在第 6 行,您再次尝试调整偏移量。这部分称为“epoch shift”,只有在随后仅调用结果 Date 对象上的基于 UTC 的函数时才能使用。尽管印度没有 DST,但在其他时区,本地时区的 DST 转换可能会影响基于本地时间的函数的结果值,例如此处显示的隐式字符串转换。综上所述,Date 对象无法调整到其他时区。
  • 确实,请考虑您的结果是错误的,因为印度 2016 年 3 月 22 日的 9:30 实际上是美国东部时间 2016 年 3 月 22 日的午夜 (00:00)。 Reference here.
  • 顺便说一句,在大多数浏览器中,您现在可以将时区指定为toLocaleString 的选项,例如:console.log(new Date(1458619200000).toLocaleString(undefined, {timeZone: 'America/New_York'}))。这会正确地将 UTC 时间戳转换为所需的时区标识符。
  • @MattJohnson 确实你是对的。感谢您进行彻底的代码审查。我会留下帖子,以便人们可以通过您的反馈看到答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多