【问题标题】:How to convert String date in some unknown locale into some other known locale? [duplicate]如何将某些未知语言环境中的字符串日期转换为其他已知语言环境? [复制]
【发布时间】:2019-10-09 17:49:42
【问题描述】:

我在 String Object (ex:(on, 22 maj, 2019)) 中有一个日期,字符串的语言环境日期未知。如您所见,它位于瑞典语言环境中,但我在运行时不知道它,我只需要使用字符串即可。如何转换首先解析此字符串,然后将其转换为特定的已知语言环境,例如:德语甚至英语。

在 java 中尝试使用 Dateformatter 和 SimpleDateFormat 但无法解决问题

【问题讨论】:

  • 你真的不能。您可以尝试每个语言环境,但有可能 2 个不同的语言环境都可以工作并给出不同的结果。例如,2-1-2017,是 1 月 2 日(英国)还是 2 月 1 日(美国)?
  • 您的字符串不遵循语言环境存储库中的任何瑞典语格式。那可能是onsdag 22 maj 2019 或只是22 maj 2019。这使得这项任务几乎不可能完成。一些启发式和不可忽视的编码工作可能会让你足够接近。
  • 一个示例日期字符串会让您无处可去。您将需要大量不同的字符串对象,以便您可以分析其中的任何模式并根据您通过该分析获得的知识设计算法。

标签: java date locale date-parsing


【解决方案1】:

我曾经有一个任务是编写一个代码来解析一个字符串到日期,而日期格式是事先不知道的。 IE。我必须解析任何有效的日期格式。我写了一个项目,之后我写了一篇文章,描述了我的实现背后的想法。这是文章的链接:Java 8 java.time package: parsing any string to date。一般的想法是将您希望支持的所有模式写入外部属性文件并从那里读取它们并尝试通过这些格式一一解析您的字符串,直到您成功或用完格式。请注意,顺序也很重要,因为某些字符串可能对多种格式有效(美国/欧洲差异)。优点是您可以在不更改代码的情况下继续向文件添加/删除格式。所以这样的项目也可以为不同的客户定制

【讨论】:

  • 你怎么知道07-08是8月7日还是7月8日?你怎么知道'Maj'是月份的全名还是月份名称的缩写?
  • @Joakim Danielson - 我的建议为您的问题提供了很好的解决方案。如果您在大多数日期预计为美国风格的环境中工作,那么您将美国格式 (...MM-dd...) 放在欧洲 (...dd-MM...) 之前,然后是 07-08将被解释为 7 月 8 日,但 31-8 将被欧洲格式捕获并解释为 8 月 31 日。如果您在欧洲风格的环境中工作,您只需按顺序切换这些格式,系统就会工作。但是,如果 07-08 是 8 月 7 日还是 7 月 8 日,根本不可能说 100%。
  • "...你的大部分日期都是预期的...",这不是问题吗?充其量你的解决方案是一个很好的猜测。
  • Joakim 在提供字符串 07-08 时没有其他信息,从技术上讲根本不可能说出它是哪一个。所以做出有根据的猜测是你能做的最好的事情。我的解决方案不仅提供了一种猜测的方法,而且还提供了一种在时间或每个站点上进行调整的方法,而无需对代码进行任何更改。该解决方案已在使用量非常大的产品的生产中得到应用,然后证明了自己。如果您有办法提供更好的解决方案,请与我们分享。否则你是在批评提案没有解决无法解决的问题
  • 如果您不确定,最好放弃并报告您无法决定,而不是冒险给出不正确的结果并让用户相信它是正确的。如果您的用户界面允许,您可以同时提供这两个选项并让用户选择。恕我直言,做出猜测,无论多么受过教育,都是你能做的最糟糕的事情。
【解决方案2】:

这是非常困难的。例如,不同的语言环境对月份和日期进行不同的排序。如果您有一个“纯数字”日期,例如“20.10.2016”,您不确定月份和日期的顺序(您通常可以识别年份,因为这通常是 4 位数字,但它可以也是2位数)。 因此,在某些情况下,日期的语言环境无法唯一标识。

如果您有边缘信息,例如,有一组特定的语言环境可以匹配,或者,给定它是什么位置的特定可能性,您可以尝试解释它们。但是,您不能绝对确定您得到了正确的解释。

我的建议是编写正则表达式来识别日期格式,然后使用 SimpleDateFormat 来解析日期。然后使用“责任链”模式尝试所有正则表达式,如果匹配,则可以使用特定的 SimpleDateFormat。

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多