如何使用 DateFormat 和 LocalDate 包格式化 ISObasic 日期
How do I format an ISObasic date using DateFormat and LocalDate packages
我正在寻找一种解决方案,让我可以将包含 iso 基本日期格式(例如 20190330
)的字符串转换为格式化日期,例如 2019-03-30
(欧洲格式)或 30/03/2019
(英国格式)或 03/30/2019
(美国格式)。格式取决于用户选择的格式。
java.time.LocalDate
和 java.time.format.DateTimeFormatter 库似乎提供了解决方案的可能性,但我发现这些库的文档不连贯且令人困惑,我不确定是否可以从这些来源获得解决方案。
我已经尝试了代码中return语句中包含的四种解决方案。
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
2019/01/31
12/25/2017
实际结果是 case 语句后 return 代码后显示的语法错误。
我的解决方法是重写 case 语句并使用如下笨拙的语句(对于 EU 格式):
case EU: { return isobasic.substring(0,4) + "-" + isobasic.substring(4,6) + "-" + isobasic.substring(6,8);}
如果这是唯一的解决方案,我会接受它,但我想先查看 formatter/localdate 库中提供的更优雅的方法。
根据我的评论,您应该尝试使用您的 iso 格式从您的字符串中获取 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"));
}
}
我正在寻找一种解决方案,让我可以将包含 iso 基本日期格式(例如 20190330
)的字符串转换为格式化日期,例如 2019-03-30
(欧洲格式)或 30/03/2019
(英国格式)或 03/30/2019
(美国格式)。格式取决于用户选择的格式。
java.time.LocalDate
和 java.time.format.DateTimeFormatter 库似乎提供了解决方案的可能性,但我发现这些库的文档不连贯且令人困惑,我不确定是否可以从这些来源获得解决方案。
我已经尝试了代码中return语句中包含的四种解决方案。
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 2019/01/31 12/25/2017 实际结果是 case 语句后 return 代码后显示的语法错误。
我的解决方法是重写 case 语句并使用如下笨拙的语句(对于 EU 格式):
case EU: { return isobasic.substring(0,4) + "-" + isobasic.substring(4,6) + "-" + isobasic.substring(6,8);}
如果这是唯一的解决方案,我会接受它,但我想先查看 formatter/localdate 库中提供的更优雅的方法。
根据我的评论,您应该尝试使用您的 iso 格式从您的字符串中获取 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"));
}
}