我不太喜欢JavaScript,我有以下问题。
我有一个JSON对象如下:
{
"start_date": "2017-11-09 06:00:00"
}在浏览器中执行的JavaScript脚本:
var dateCurrentOriginalForecast = new Date(currentOriginalForecast.start_date);它工作得很好:它创建了一个新的date对象,其值与2017-11-09 :00:00 Date相关。
问题是,我必须使用JavaScript Rhino(允许在应用程序中执行JS代码的JavaScript实现)将这个JavaScript脚本执行到Java应用程序中,在这里它会导致一个错误:
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标准的东西。
我不能用第三方图书馆。
我该怎么做呢?
发布于 2017-11-09 12:20:09
可以使用Date#toISOString()或Date#toJSON()
let d = new Date('2017-11-09 06:00:00')
console.log(d.toISOString())
console.log(d.toJSON())
发布于 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()
发布于 2017-11-09 13:40:36
如果我正确理解了您的问题,那么问题不在于您需要一个ISO8601格式化日期,而是您需要从一个没有在ISO8601中格式化的日期创建一个Date对象。我个人只需要使用正则表达式将日期解析到它的各个部分,然后将它们传递到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的月份。
https://stackoverflow.com/questions/47201354
复制相似问题