如何忽略javascript时区将日期时间发送到服务器

Posted

技术标签:

【中文标题】如何忽略javascript时区将日期时间发送到服务器【英文标题】:How to ignore javascript timezone to send a datetime to server 【发布时间】:2018-04-28 12:09:08 【问题描述】:

我正在使用 c# 和 Angular 构建一个 Web 应用程序来存储事件时间表。用户将输入一个 UTC 日期时间,我想将该时间完全保存在 db 中。然后显示用户查看此信息的完全相同的时间。这不应该取决于用户的时区,我告诉用户时间是 UTC。

但问题是当 ajax 发布到服务器时,浏览器会发送带有时区信息的时间信息,并且服务器在 db 中保存不同的时间(通过转换自己的时区),因为服务器位于不同的时区。

如何预防?

【问题讨论】:

How do I get a UTC Timestamp in javascript?的可能重复 可能不是,因为我想发送一个没有时区信息的日期时间,我不想用 UTC 时区信息发送它。因为当我发送 UTC 时间时,如果服务器不在 UTC GMT 0 时区,服务器会将其转换为新时间。 你使用的是html5日期时间输入吗? 这是一个角度日期选择器。 【参考方案1】:

如果您使用 .Net Web API 作为后端,您可以在 Web API WebApiconfig.cs 中配置时区,如下所示。它将以 UTC 序列化时间。

public static void Register(HttpConfiguration config)

    config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;

【讨论】:

或者使用 config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.RoundtripKind; //转换时要保留时区信息。【参考方案2】:

我不确定你是如何格式化的。但我认为如果您不想使用任何自定义解决方案,您可以使用 momentjs。以下代码应该可以工作

moment(your_date_time).format('YYYY-MM-DD HH:mm:ss')

如果 your_date_time 有时区,那么以下应该可以工作

moment().utc().format('YYYY-MM-DD HH:mm:ss')

【讨论】:

是的,第一种格式的时刻确实在那里工作。实际上,没有时区信息而不是日期时间对象的给定字符串格式在那里是可行的。当我将时间信息从服务器发送回客户端时,同样的事情也适用。需要发送特定的字符串格式而不是日期时间对象。谢谢。【参考方案3】:

所以如果你使用的是html5 datetime,那么你可以把它改成datetime-local

<input type="datetime-local">

这将为您提供没有时区信息的日期时间。

这是一个例子。

var dateControl = document.querySelector('input[type="datetime-local"]');
dateControl.value = '2017-06-01T08:30';

let btn = document.getElementById('btns');
let inp = document.getElementById('party');
let dv = document.getElementById('displayValue');
btn.addEventListener('click', ()=>
  dv.innerText = inp.value;
);
<label for="party">Enter a date and time for your party booking:</label>
<input id="party" type="datetime-local" name="partydate" value="2017-06-01T08:30">

<button type="submit" id="btns">Check Value</button>

<div id="displayValue">
  
</div>

代码 sn-p 只是为了让您了解如何使用 datetime-local。 如果您使用 angular 2/4,那么您可以直接将 ngModel 绑定到一个变量,就像通常获取值一样。

【讨论】:

以上是关于如何忽略javascript时区将日期时间发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章

javascript toISOString() 忽略时区偏移

javascript toISOString()忽略时区偏移量

Javascript:将 24 小时时间字符串转换为 12 小时时间,上午/下午且无时区

如何在Javascript中将日期转换为其他时区[重复]

在指定时区导入日期时间,忽略夏令时

如何在javascript中将日期时间从用户时区转换为EST [重复]