【问题标题】:converting string representation of unknown date-format to Date in java在java中将未知日期格式的字符串表示转换为日期
【发布时间】:2016-01-13 01:52:40
【问题描述】:

我有一个代表日期的字符串。 我不知道字符串的日期格式。但仅作为示例,它可能是任何一个

  • 2015-10-14T16:41:42.000Z
  • 2015-10-14T19:01:53.100+01:00
  • 2015-10-14 05:20:29

或网站可用于在元标记中描述日期的任何有效格式(因此该格式将是官方的,而不是异想天开的,但可能性并不小)。

我可以使用 joda-time 来解决这个问题吗? java.util.Date 或者别的怎么样?

更新

我想我找到了与我正在寻找的 Javascript 等价物

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

但我需要 Java 的答案。

【问题讨论】:

  • 这两个建议都需要我事先知道格式。我的问题的标题指定了“未知”格式:)。你们知道有什么方法可以为我的情况获取所有可能的日期格式吗? (当然,希望这是一个非常小的集合)。我不介意编写多个解析器,但问题是格式可以是对包含日期的 html 元标记有效的任何内容。
  • 没有“简单”的答案,一般的答案是使用格式列表,并继续尝试将值与格式列表进行转换,直到一个有效
  • @Gimby 您的评论既不明智,也没有帮助,也没有必要:OP 提供了一个链接,其中 JavaScript 实际存在这样的功能。所以这是一个有价值的问题。也许 Google 或 Oracle 或 joda-time 或任何负责创建权威 Java 函数的人都应该注意。像这样的 Java 函数对许多开发人员来说是无价的。
  • @KatedralPillon 你的(假设总是 24 小时制)看起来像 4-digit-year, literal_dash, 2-digit-month, literal_dash, 2-digit-day, one-space-or-literal_T, 2-digit-hour, literal_colon, 2-digit-minute, literal_colon, 2-digit-second (等)。正则表达式(不检查有效范围)是 like \d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(\.\d{3})?(.*)? (添加适当的捕获组以提取片段)(\.\d{3})? 是可选的 3 位数的百分之一秒;最后的(.*)? 是可选的时区信息,需要更多的解析来判断它是一个区域(Z、EST 等)还是一个偏移量(+01:00)

标签: java datetime jodatime


【解决方案1】:

这不是真正的“java”解决方案,但如果您找到了 Javascript 解决方案,那么您可以使用 ScriptEngine 在 java 中使用 Javascript 解决方案。

只是有点快和肮脏... :)

这是一个示例代码:

public static void main(String[] args) throws ScriptException, ParseException {
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");
    String[] dateStrings = new String[] {
            "2015-10-14T16:41:42.000Z",
            "2015-10-14T19:01:53.100+01:00",
            "2015-10-14 05:20:29" };

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    for (String d : dateStrings) {
        String script = "new Date('" + d + "')";
        Object eval = engine.eval(script);
        Date parsed = sdf.parse(eval.toString().replace("[Date ", "").replace("]", ""));
        System.out.println(eval + " -> " + parsed);

    }

}

打印出来的:

[Date 2015-10-14T16:41:42.000Z] -> Wed Oct 14 18:41:42 CEST 2015
[Date 2015-10-14T18:01:53.100Z] -> Wed Oct 14 20:01:53 CEST 2015
[Date 2015-10-14T03:20:29.000Z] -> Wed Oct 14 05:20:29 CEST 2015

eval.toString() 部分可以明显改进。作为区域设置...

【讨论】:

  • 这实际上可能会有所帮助。不过,我正在使用应用程序引擎。谷歌技术并不总是能很好地与其他技术配合使用。我会仔细看看的。谢谢。
  • 我正在查看页面,但我不确定我在查看什么。你介意展示我如何使用 ScriptEngine 在 Java 中调用 JS new Date(dateString) 构造的简短代码吗?
  • 我不知道您的示例是否有效,但 ScriptEngine 的想法应该可以,所以我正在测试一些代码(您的和我自己的版本),一旦成功就会报告。同时 +1。
  • 下面的工作不应该吗? String script = "var date = new Date('" + dateString + "'); var timestamp = date.getTime();"; 然后long timestamp = ((Long) engine.get("timestamp")).longValue(); ?
  • 是的,它可以工作,但您必须评估脚本字符串 engine.eval(script);,然后获取 var,但要转换为 Double 而不是 Long:long timestamp = ((Double) engine.get("timestamp")).longValue();
猜你喜欢
  • 2020-11-19
  • 2013-12-28
  • 1970-01-01
  • 2013-09-14
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多