【问题标题】:How do I parse "dd.MM.yyyy G" to ISO-Date in Java? [duplicate]如何在 Java 中将“dd.MM.yyyy G”解析为 ISO-Date? [复制]
【发布时间】:2014-01-06 14:49:45
【问题描述】:

大家好,我有日期 "01.01.1000 AD"(SimpleDate) 作为字符串和 dd.MM.yyyy G(SimpleFormat),需要将其解析为 1995-12-31T23:59:59Z (yyyy-MM-dd'T'hh:mm:ss'Z') 形式的标准 ISO 日期

我的实际代码是:

public static String getISODate(String simpleDate, String simpleFormat, String isoFormat) throws ParseException {
    Date date;
    if (simpleFormat.equals("long")) {
        date = new Date(Long.parseLong(simpleDate));
    } else {
        SimpleDateFormat df = new SimpleDateFormat(simpleFormat);
        df.setTimeZone(TimeZone.getTimeZone("UTC"));
        // or else testcase
        // "1964-02-24" would
        // result "1964-02-23"
        date = df.parse(simpleDate);
    }
    return getISODate(date, isoFormat);
}

有人知道我该怎么做吗?

【问题讨论】:

  • 01.01.1000 AD 指的是什么日历?
  • 看看DateFormat,尤其是parseformat方法。
  • 对于公元 1000 年的日期,您必须考虑有趣的现象,例如 1582 年从儒略到格里高利的转变,以及一个地点在过去 1000 年。
  • String isoFormat 在我的情况下为空

标签: java parsing date datetime


【解决方案1】:

试试这个:

    String string = "01.01.1000 AD";
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy GG");
    Date date = dateFormat.parse(string);

日期格式中的 G 代表时代。

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

【讨论】:

  • 我仍然得到一个例外java.text.ParseException: Unparseable date: "01.01.1000 AD"
  • 如果我像这样设置语言环境,我可以重现您的错误:SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy GG", Locale.GERMANY);,所以它看起来像一个语言环境问题。
【解决方案2】:

这将有望帮助 [标准 jdk 棘手,但至少可能 - 而且 JSR 310 不支持此功能:-( ]:

DateFormat df = new SimpleDateFormat("dd.MM.yyyy GG", Locale.US);
DateFormat iso = new SimpleDateFormat("yyyy-MM-dd");
try {
    Date d = df.parse("01.01.1000 AD");
    System.out.println(iso.format(d)); // year-of-era => 1000-01-01 (not iso!!!)

    // now let us configure gregorian/julian date change right for ISO-8601
    GregorianCalendar isoCalendar = new GregorianCalendar();
    isoCalendar.setGregorianChange(new Date(Long.MIN_VALUE));
    iso.setCalendar(isoCalendar);
    System.out.println(iso.format(d)); // proleptic iso year: 1000-01-06
} catch (ParseException ex) {
    ex.printStackTrace();
}

【讨论】:

  • 顺便说一下,与历史日期相关的 ISO 格式包括小时甚至毫秒是没有意义的。因此,我故意省略了时间部分。
  • 为了避免 DST 影响,明智的做法是在格式对象 df 和 iso 中将时区设置为 UTC。祝你好运。
  • 问题是我需要它作为我的 Solr-Index 的 iso-date,如果你想搜索 facet 8,Solr 只能使用 ISO-date,这就是我需要做的)
  • 现在这对我有用,问题是错误的语言环境 'public static String getISODate(String simpleDate, String simpleFormat, String isoFormat) throws ParseException { Date date; if (simpleFormat.equals("long")) { date = new Date(Long.parseLong(simpleDate)); } else { SimpleDateFormat df = new SimpleDateFormat(simpleFormat, Locale.US); df.setTimeZone(TimeZone.getTimeZone("UTC"));日期 = df.parse(simpleDate); } 返回 getISODate(日期,isoFormat); }`
  • 首先要注意:使用 Locale.US 代码将成功解析。第二:01.01.1000 AD 正确转换为 1000-01-06(纯 ISO)。第三:由于缺乏对 java 的支持,我忽略了当时欧洲大多数国家的历史细节,这一年不是从 1 月初开始,而是在 3 月或 4 月开始。第四:如果你真的需要 solr-interface 的时间部分,只需将其设置为午夜。
【解决方案3】:

这样的?

String date = "01.01.1000 AD";   
SimpleDateFormat parserSDF = new SimpleDateFormat("dd.mm.yyyy GG");   
System.out.println(parserSDF.parse(date));   

【讨论】:

  • MM 必须使用几个月。
【解决方案4】:

试试可能会有帮助:

public static String getISODate(String simpleDate, String simpleFormat, String isoFormat) throws ParseException {
    Date date;
    if (simpleFormat.equals("long")) {
        date = new Date(Long.parseLong(simpleDate));
    } else {
        SimpleDateFormat df = new SimpleDateFormat(simpleFormat);
        df.setTimeZone(TimeZone.getTimeZone("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
        // or else testcase
        // "1964-02-24" would
        // result "1964-02-23"
        date = df.parse(simpleDate);
    }
    return getISODate(date, isoFormat);
}

【讨论】:

  • yyyy-MM-dd'T'HH:mm:ss.SSSZ 不是有效的时区标识符,而是 SimpleDateFormat 的模式字符串。
  • 还是java.text.ParseException: Unparseable date: "01.01.1000 AD"
  • 那是因为对于您输入的时区,00:00:00 01-01-1000 AD 的时刻不存在。如果您在夏令时开始时跳过的小时中选择一个日期/时间瞬间,您将在每年 1 小时内看到相同的错误。
猜你喜欢
  • 2015-12-26
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多