Java 如何使用DateFormat和LocalDate包格式化ISObasic日期

Java 如何使用DateFormat和LocalDate包格式化ISObasic日期,java,localdate,dateformatter,Java,Localdate,Dateformatter,我正在寻找一种解决方案,可以将包含iso基本日期格式的字符串(如20190330)转换为格式化日期(如2019-03-30(欧元格式)或30/03/2019(英国格式)或03/30/2019(美国格式)。格式取决于用户选择的格式。 库java.time.LocalDate和java.time.format.DateTimeFormatter似乎提供了解决方案的可能性,但我发现这些库的文档不连贯且令人困惑,我不确定是否可以从这些源中找到解决方案 我尝试了代码中返回语句中包含的四种解决方案 impo

我正在寻找一种解决方案,可以将包含iso基本日期格式的字符串(如
20190330
)转换为格式化日期(如
2019-03-30
(欧元格式)或
30/03/2019
(英国格式)或
03/30/2019
(美国格式)。格式取决于用户选择的格式。 库
java.time.LocalDate
和java.time.format.DateTimeFormatter似乎提供了解决方案的可能性,但我发现这些库的文档不连贯且令人困惑,我不确定是否可以从这些源中找到解决方案

我尝试了代码中返回语句中包含的四种解决方案

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class DateFormatter {
  private static final String EU_PATTERN = "yyyy-MM-dd";
  private static final String UK_PATTERN= "dd/MM/yyyy";
  private static final String US_PATTERN= "MM/dd/yyyy";
  private static final int EU = 1;
  private static final int UK = 2;
  private static final int US = 3;

  private static String formattedDate(int fmt, String isobasic){
    String pattern = null;
    switch(fmt) {
      case EU: {pattern = EU_PATTERN; break;} 
      case UK: {pattern = UK_PATTERN; break;}
      case US: {pattern = US_PATTERN; break;}
    }
    DateTimeFormatter dateFormatter =     DateTimeFormatter.ofPattern(pattern);
        //    return dateFormatter.format(isobasic); // String cannot be         converted to Temporal Accessor
//    return (String)dateFormatter.format(isobasic); // String cannot be     converted to Temporal Accessor
//    return LocalDate.parse(isobasic, dateFormatter); // LocalDate     cannot be converted to String
      return (String)LocalDate.parse(isobasic, dateFormatter); //     LocalDate cannot be converted to String
  }

  /**
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    System.out.println(formattedDate(EU, "20180927"));
    System.out.println(formattedDate(UK, "20190131"));
    System.out.println(formattedDate(US,  "20171225"));
  }
根据所选格式,预期结果将是三个格式化日期: 2018-09-27 31/01/2019 12/25/2017 实际结果是case语句后面的返回代码后面显示的语法错误

我的解决方法是重写case语句,并使用如下笨拙的语句(对于EU格式):


如果这是我唯一能接受的解决方案,但我想先看看formatter/localdate库提供了一种更优雅的方法。

在我的评论之后,您应该尝试使用iso格式从字符串中获取临时Accessor,然后将其格式化为所需的模式

我只是对您的代码做了最小的更改以实现结果,您可以尝试一下

public class DateFormatter {
    private static final String ISO = "yyyyMMdd";
    private static final String EU_PATTERN = "yyyy-MM-dd";
    private static final String UK_PATTERN = "dd/MM/yyyy";
    private static final String US_PATTERN = "MM/dd/yyyy";
    private static final int EU = 1;
    private static final int UK = 2;
    private static final int US = 3;

    private static String formattedDate(int fmt, String isobasic) {
        String pattern = null;
        switch (fmt) {
            case EU: {
                pattern = EU_PATTERN;
                break;
            }
            case UK: {
                pattern = UK_PATTERN;
                break;
            }
            case US: {
                pattern = US_PATTERN;
                break;
            }
        }
        DateTimeFormatter parser = DateTimeFormatter.ofPattern(ISO);
        TemporalAccessor parsedDate = parser.parse(isobasic);
        return DateTimeFormatter.ofPattern(pattern).format(parsedDate);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println(formattedDate(EU, "20180927"));
        System.out.println(formattedDate(UK, "20190131"));
        System.out.println(formattedDate(US, "20171225"));
    }
}

最好是将您得到的异常单独发布。另外,不要将结果强制转换为(字符串),调用.toString(foo)或String.valueOf(foo),因为您不确定它是否确实是字符串。您尝试从字符串中获取字符串,因此首先必须使用正确的格式(“yyyyMMdd”)解析输入然后使用您的模式之一格式化结果。从一种字符串格式转换为另一种字符串格式通常需要两(2)个格式化程序,一个指定源格式(用于解析),另一个指定所需格式(用于格式化).我知道链接原始问题的许多答案都使用了麻烦且过时的
SimpleDataFormat
类。不要那样做。像你自己一样,使用java.time来寻找答案。和新手一起工作(不管你最初遇到的麻烦是什么),都是更好的。补充建议:考虑<代码> DateTimeFormatter。如果您只想处理欧洲、英国和美国,请对这三个变量使用
enum
,而不是
int
常量。还有一个
EnumMap
,用于保存格式模式字符串。我非常感谢您指向TemporalAssessor类的指针,它提供了我一直在寻找的解决方案。示例和教程中通常不介绍此类的使用,因此您的解决方案提供了有价值的附加信息。没有TemporalAccessor,还有其他库可以实现相同的结果,但是,当您想将日期从一个字符串转换为另一个格式字符串时,它们中的大多数行为都是相同的,您首先必须指定一个模式对其进行解析,然后使用目标模式对结果进行格式化。如果您的问题已通过我的回答得到解决,请您将其标记为已接受,以便具有相同问题的人可以更轻松地找到响应,如果问题未得到解决,请随意添加有关哪些问题不起作用的信息。我确实认为没有理由在
LocalDate
上使用
TemporalAccessor
。我宁愿推荐后者。
public class DateFormatter {
    private static final String ISO = "yyyyMMdd";
    private static final String EU_PATTERN = "yyyy-MM-dd";
    private static final String UK_PATTERN = "dd/MM/yyyy";
    private static final String US_PATTERN = "MM/dd/yyyy";
    private static final int EU = 1;
    private static final int UK = 2;
    private static final int US = 3;

    private static String formattedDate(int fmt, String isobasic) {
        String pattern = null;
        switch (fmt) {
            case EU: {
                pattern = EU_PATTERN;
                break;
            }
            case UK: {
                pattern = UK_PATTERN;
                break;
            }
            case US: {
                pattern = US_PATTERN;
                break;
            }
        }
        DateTimeFormatter parser = DateTimeFormatter.ofPattern(ISO);
        TemporalAccessor parsedDate = parser.parse(isobasic);
        return DateTimeFormatter.ofPattern(pattern).format(parsedDate);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println(formattedDate(EU, "20180927"));
        System.out.println(formattedDate(UK, "20190131"));
        System.out.println(formattedDate(US, "20171225"));
    }
}