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

时间:2017-11-09 12:02:42

标签: javascript rhino iso8601

我不是那么喜欢JavaScript而且我有以下问题。

我有一个像这样的 JSON 对象:

{
    "start_date": "2017-11-09 06:00:00"
}

进入浏览器执行的JavaScript脚本:

var dateCurrentOriginalForecast = new Date(currentOriginalForecast.start_date);

它工作正常:它创建一个新的Date对象,其值与 2017-11-09 06:00:00 日期相关。

问题在于我必须使用 Rhino (一种允许在Java应用程序中执行JS代码的JavaScript实现)将此JavaScript脚本执行到Java应用程序中,并在此处导致错误:< / p>

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)

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

根据我的理解在线阅读问题应该是旧的JS或Rhino(可能是Rhino实现的JS版本)不支持这种类型的日期,可能我必须以完全符合的日期格式转换它 ISO 8601

所以我认为我必须将我的字符串 2017-11-09 06:00:00 转换为符合 ISO 8601 标准的内容。

我无法使用第三方库。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

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

let d = new Date('2017-11-09 06:00:00')

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

答案 1 :(得分:0)

//如果您想要转换日期而不是时区转换

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

//如果你想用utc timezone转换日期 var date = new Date(“2017-11-09 06:00:00”)。toISOString()

答案 2 :(得分:0)

如果我已正确理解您的问题,问题不在于您需要ISO 8601格式的日期,而是您需要从未在ISO格式化的日期创建Date对象8601.我个人只是使​​用正则表达式将日期解析为它的部分,然后将它们传递给Date构造函数:

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的月份。