【问题标题】:How can I convert this string representing a Date into an ISO 8601 compliant using JS?如何使用 JS 将此表示日期的字符串转换为符合 ISO 8601 的字符串?
【发布时间】:2017-11-09 12:02:41
【问题描述】:

我不是很喜欢 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 应用程序中,这会导致错误:

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 06:00:00 转换为符合 ISO 8601 标准的字符串。

我无法使用第三方库。

我该怎么做?

【问题讨论】:

  • 你试过'2017-11-09T06:00:00'或'2017-11-09T06:00:00T'吗?也许它只是缺少T 和/或Z。在 JS 中,它在所有三个版本中都能正常工作。
  • 我不确定您需要什么。是如何在 javascritp 中生成 ISO8601 日期还是其他方式?
  • @NinaScholz 你到底是什么意思?我该做什么?
  • 用这两个字符串测试一下看看是否有效。
  • @NinaScholz 我都试过了: var dateCurrentOriginalForecastISO8601 = new Date('2017-11-09T06:00:00');和 var dateCurrentOriginalForecastISO8601 = new Date('2017-11-09T06:00:00T');但我仍然收到无效日期错误消息

标签: javascript rhino iso8601


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    //如果你想转换日期而不在时区转换

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

    //如果你想用UTC时区转换日期 var date = new Date("2017-11-09 06:00:00").toISOString()

    【讨论】:

    • 某些浏览器无法正常工作,因此附加日期 = 日期 + ".000z";对于没有在 UTC 时区转换日期
    【解决方案3】:

    如果我正确理解了您的问题,那么问题不在于您需要一个 ISO 8601 格式的日期,而是您需要从一个未在 ISO 8601 中格式化的日期创建一个 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 开始的月份。

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 1970-01-01
      • 2011-01-13
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多