首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用JS将表示日期的字符串转换为符合ISO 8601标准的字符串?

如何使用JS将表示日期的字符串转换为符合ISO 8601标准的字符串?
EN

Stack Overflow用户
提问于 2017-11-09 12:02:41
回答 3查看 874关注 0票数 0

我不太喜欢JavaScript,我有以下问题。

我有一个JSON对象如下:

代码语言:javascript
运行
复制
{
    "start_date": "2017-11-09 06:00:00"
}

在浏览器中执行的JavaScript脚本:

代码语言:javascript
运行
复制
var dateCurrentOriginalForecast = new Date(currentOriginalForecast.start_date);

它工作得很好:它创建了一个新的date对象,其值与2017-11-09 :00:00 Date相关。

问题是,我必须使用JavaScript Rhino(允许在应用程序中执行JS代码的JavaScript实现)将这个JavaScript脚本执行到Java应用程序中,在这里它会导致一个错误:

代码语言:javascript
运行
复制
TID: [-1234] [] [2017-11-09 11:10:08,915]  INFO {org.apache.synapse.mediators.bsf.ScriptMessageContext} -  dateCurrentOriginalForecast: Invalid Date {org.apache.synapse.mediators.bsf.ScriptMessageContext}
TID: [-1234] [] [2017-11-09 11:10:08,918] ERROR {org.apache.synapse.mediators.bsf.ScriptMediator} -  The script engine returned an error executing the inlined js script function mediate {org.apache.synapse.mediators.bsf.ScriptMediator}
com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.EcmaError: RangeError: Date is invalid. (<Unknown Source>#137) in <Unknown Source> at line number 137
        at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68)
        at javax.script.CompiledScript.eval(CompiledScript.java:92)

该日期似乎无效,无法创建 date 对象。

根据我在网上的理解,问题应该是老JS或Rhino (可能是Rhino实现的JS版本)不支持这种类型的日期,可能我必须将其转换成完全符合ISO 8601的日期格式。

所以我认为我必须把我的字符串2017-11-09 :00:00转换成类似于符合ISO 8601标准的东西。

我不能用第三方图书馆。

我该怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2017-11-09 12:20:09

可以使用Date#toISOString()Date#toJSON()

代码语言:javascript
运行
复制
let d = new Date('2017-11-09 06:00:00')

console.log(d.toISOString())
console.log(d.toJSON())

票数 0
EN

Stack Overflow用户

发布于 2017-11-09 12:29:12

//如果希望在时区中不进行转换,则为

var date = '2017-11-09 :00:00‘;var convertDate = date.replace(“","T");// 2017-11-09T06:00:00

//如果您想使用utc时区变量date =新日期(“2017-11-09 06:00:00”)转换.toISOString()

票数 0
EN

Stack Overflow用户

发布于 2017-11-09 13:40:36

如果我正确理解了您的问题,那么问题不在于您需要一个ISO8601格式化日期,而是您需要从一个没有在ISO8601中格式化的日期创建一个Date对象。我个人只需要使用正则表达式将日期解析到它的各个部分,然后将它们传递到Date构造函数中:

代码语言:javascript
运行
复制
var currentOriginalForecast = {
    "start_date": "2017-11-09 06:00:00"
};

var rxParseDate = /(\d{4})-(\d\d)-(\d\d)\s+(\d\d):(\d\d):(\d\d)/;
var dateParts = currentOriginalForecast.start_date.match(rxParseDate);

var year = dateParts[1],
  month = dateParts[2],
  day = dateParts[3],
  hour = dateParts[4],
  minute = dateParts[5],
  second = dateParts[6];

var dateCurrentOriginalForecast = new Date(Date.UTC(year, month - 1, day, hour, minute, second));

console.log(dateCurrentOriginalForecast);

由于start_date中没有提到时区,我假设它是UTC,并使用Date.UTC转换它,并将得到的时间戳从该时间戳传递到Date构造函数中。如果start_date在本地时间,您只需删除Date.UTC并将参数直接传递到Date构造函数。我还将提到month - 1;这是因为Date构造函数(和Date.UTC)期望一个基于0的月份。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47201354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档