假设您网站的用户输入了一个日期范围。
2009-1-1 to 2009-1-3
您需要将此日期发送到服务器进行某些处理,但服务器要求所有日期和时间均为UTC。
现在假设用户在阿拉斯加。由于它们所处的时区与UTC完全不同,因此需要将日期范围转换为如下所示:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
使用JavaScriptDate对象,如何将第一个“本地化”日期范围转换为服务器能够理解的内容?
假设您网站的用户输入了一个日期范围。
2009-1-1 to 2009-1-3
您需要将此日期发送到服务器进行某些处理,但服务器要求所有日期和时间均为UTC。
现在假设用户在阿拉斯加。由于它们所处的时区与UTC完全不同,因此需要将日期范围转换为如下所示:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
使用JavaScriptDate对象,如何将第一个“本地化”日期范围转换为服务器能够理解的内容?
当前回答
如果您的日期上有时区,则可以使用date fns tz:
import { zonedTimeToUtc } from 'date-fns-tz';
const dateBrazil = new Date() // I'm in Brazil, you should have or get the user timezone.
const dateUtc = zonedTimeToUtc(dateBrazil, 'America/Sao_Paulo')
其他回答
对于目标是将其作为“日期对象”而不是字符串获取的其他人,并且您只想显示不带TZ(可能是硬编码的)的日期/时间,您可以做的是:
const now = new Date();
const year = now.getUTCFullYear();
const month = now.getUTCMonth();
const day = now.getUTCDate();
const hour = now.getUTCHours();
const tomorrowUTC= new Date();
tomorrowUTC.setDate(day + 1); // +1 because my logic is to get "tomorrow"
tomorrowUTC.setYear(year);
tomorrowUTC.setMonth(month);
tomorrowUTC.Hours(hour);
// then use the tomorrowUTC for to display/format it
// tomorrowUTC is a "Date" and not a string.
然后,您可以执行以下操作:
我们将在${格式(明天UTC,'EEEE do MMMM hh:mmaa')}UTC删除您的帐户
(格式是一个日期fns函数,如果需要,可以使用其他lib);
这有点“黑客”,因为这仍然使用本地时区,但如果你只想显示日期而不是时区,那么这就可以了。
我发现jQuery全球化插件的日期解析工作得最好。其他方法存在跨浏览器问题,像date.js这样的东西已经很长时间没有更新了。
页面上也不需要datePicker。您可以调用与文档中给出的示例类似的内容:
$.parseDate('yy-mm-dd', '2007-01-26');
看看你的问题,很明显,你只想将日期范围发送到后端进行进一步的后期处理。
我假设您符合标准数据指南,该指南要求数据采用特定格式。例如,我使用ODATA,这是一个RESTfull API,它期望日期时间对象的格式为:-
YYYY-MM-ddt0:00:00。
这可以通过下面的代码段轻松实现(请根据您的要求更改格式)。
var mydate//假设这是我要公开的约会对象var UTCDateStr=mydate.getUTCFullYear()+“-”+mydate.get-UTCMonth()+”-“+mydate.getUTCDate()+(T00:00:00);
另一方面,如果您处于我的情况,您从后端收到了一个日期,浏览器会将其转换为您的本地日期。另一方面,如果您对UTC日期感兴趣,则可以执行以下操作:-
var mydate//假设这是我要公开的约会对象var UTCDate=新日期(mydate)/*创建日期对象的副本。仅当您出于某种原因需要原始本地日期时才需要*/UTCDate.setTime(UTCDate.getTime()+UTCDate.getTimezoneOffset()*60*1000);
上面的代码片段基本上是根据时区添加/减去浏览器添加/减去的时间。
例如,如果我在美国东部时间(GMT-5),并且我的服务返回日期时间对象=2016年8月17日星期三00:00:00 GMT-0500我的浏览器会自动减去时区偏移(5hrs)以获得我的本地时间。因此,如果我尝试获取2016年8月16日星期三19:00:00 GMT-0500的时间。这会导致很多问题。那里有很多库,这肯定会让这变得更容易,但我想分享纯JS方法。
有关更多信息,请查看:http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/在那里我得到了灵感。
希望这有帮助!
该方法将为您提供:2017-08-04T11:15:00.000+04:30,您可以忽略区域变量,只需获得2017-08-04T1 1:15:00.000。
function getLocalIsoDateTime(dtString) {
if(dtString == "")
return "";
var offset = new Date().getTimezoneOffset();
var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
//Next two lines can be removed if zone isn't needed.
var absO = Math.abs(offset);
var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
return localISOTime + zone;
}
如果你经常与日期打交道,那么使用moment.js是值得的(http://momentjs.com). 转换为UTC的方法为:
moment(yourTime).utc()
您可以使用格式将日期更改为所需的任何格式:
moment(yourTime).utc().format("YYYY-MM-DD")
当前也有偏移选项,但有一个额外的补充库用于处理时区(http://momentjs.com/timezone/). 时间转换如下所示:
moment.tz(yourUTCTime, "America/New_York")