Java 日期时间格式检查和重置
Java date time format check and reset
字符串是一个输入,我必须检查它是否是这些格式中的任何一种。如果它是 sdf1 格式则通过,如果它是 sdf2,3.... 然后我添加缺少的格式并用 sdf1 格式解析它
SimpleDateFormat sdf1 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ssa");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mma");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mm");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy");
这是我的
try{
// Parse if it is MM/dd/yyyy hh:mm:ss a
cal = Calendar.getInstance();
cal.setTime(sdf1.parse(inStr));
}catch(Exception exp){
try{
cal = Calendar.getInstance();
//Parse if it is MM/dd/yyyy hh:mm:ssa
sdf2.parse(inStr);
inStr = new StringBuilder(inStr).insert(str.length()-2, " ").toString();
cal.setTime(sdf1.parse(inStr));
}catch(Exception dte2){
try{
cal = Calendar.getInstance();
//Parse if it is MM/dd/yyyy hh:mma
sdf3.parse(inStr);
//if pass then set 00:00:00 AM
inStr = inStr+" AM";
inStr = new StringBuilder(inStr).insert(str.length()-2, ":00").toString();
cal.setTime(sdf1.parse(inStr));
它一直在尝试解析,如果在异常块中失败,则检查下一个。
有没有简单的方法可以做到这一点,可能在 JAVA 8 中?
我可以使用标记为重复的 link 它谈论如何解析,但我有额外的要求作为自动完成缺少格式。
在 Java 8 中,您可以使用带有许多可选部分的 java.time.format.DateTimeFormatter
- 由 []
:
分隔
DateTimeFormatter fmt = DateTimeFormatter
.ofPattern("MM/dd/yyyy[ hh:mm[[:ss][ ]a]][HH:mm]", Locale.US);
如果您只想验证输入 - 而不是将结果分配给 date/time 变量 - 只需调用 parse
就足够了。这适用于以下所有情况:
fmt.parse("10/20/2018");
fmt.parse("10/20/2018 10:20");
fmt.parse("10/20/2018 10:20AM");
fmt.parse("10/20/2018 10:20 AM");
fmt.parse("10/20/2018 10:20:30AM");
fmt.parse("10/20/2018 10:20:30 AM");
如果输入无效,它会抛出一个DateTimeParseException
。
注意there's a difference between HH
and hh
。 H
用于 hour-of-day(值介于 0 和 23 之间),而 h
用于 clock-hour-of-am-pm(值介于 1 和 12 之间)。 H
不能和 AM/PM 指示符一起使用,而 h
必须有 AM/PM 来消除歧义。这就是为什么有 2 个不同的可选部分,每个部分一个。
我也使用 Locale.US
因为 AM/PM 字符串是本地化的。虽然对于大多数语言环境,结果是 "AM" 或 "PM",但对于其他一些语言环境,它可以是小写 ("am"),或一些其他值(例如,日语中的 午後
).
如果您不设置语言环境,它将使用 JVM 默认设置。但我更喜欢将它设置为特定的,我知道它会与我的输入一起工作。
要再次打印所有字段的这些值,有点棘手。
输入只能有日期(日、月、年)或日期和时间(日、月、年、小时、分钟),因此一种替代方法是使用 LocalDateTime
(并设置缺失的字段当不存在时)。
您可以使用 parseBest
然后检查解析的类型:
// parse, try to create a LocalDateTime - if it's not possible, try a LocalDate
TemporalAccessor parsed = fmt.parseBest("10/20/2018", LocalDateTime::from, LocalDate::from);
LocalDateTime dt = null;
if (parsed instanceof LocalDateTime) {
// LocalDateTime parsed (all fields set)
dt = (LocalDateTime) parsed;
} else if (parsed instanceof LocalDate) {
// LocalDate parsed (set time fields)
dt = ((LocalDate) parsed)
// set time (use whatever value you want - I'm using 10 AM as example)
.atTime(LocalTime.of(10, 0));
}
然后您使用另一个格式化程序进行输出 - 这是因为第一个格式化程序将在格式化时打印所有可选部分,所以它会打印两次小时。只需创建另一个即可:
DateTimeFormatter outputFmt = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a", Locale.US);
System.out.println(dt.format(outputFmt)); // 10/20/2018 10:00:00 AM
字符串是一个输入,我必须检查它是否是这些格式中的任何一种。如果它是 sdf1 格式则通过,如果它是 sdf2,3.... 然后我添加缺少的格式并用 sdf1 格式解析它
SimpleDateFormat sdf1 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ssa");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mma");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mm");
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy");
这是我的
try{
// Parse if it is MM/dd/yyyy hh:mm:ss a
cal = Calendar.getInstance();
cal.setTime(sdf1.parse(inStr));
}catch(Exception exp){
try{
cal = Calendar.getInstance();
//Parse if it is MM/dd/yyyy hh:mm:ssa
sdf2.parse(inStr);
inStr = new StringBuilder(inStr).insert(str.length()-2, " ").toString();
cal.setTime(sdf1.parse(inStr));
}catch(Exception dte2){
try{
cal = Calendar.getInstance();
//Parse if it is MM/dd/yyyy hh:mma
sdf3.parse(inStr);
//if pass then set 00:00:00 AM
inStr = inStr+" AM";
inStr = new StringBuilder(inStr).insert(str.length()-2, ":00").toString();
cal.setTime(sdf1.parse(inStr));
它一直在尝试解析,如果在异常块中失败,则检查下一个。 有没有简单的方法可以做到这一点,可能在 JAVA 8 中? 我可以使用标记为重复的 link 它谈论如何解析,但我有额外的要求作为自动完成缺少格式。
在 Java 8 中,您可以使用带有许多可选部分的 java.time.format.DateTimeFormatter
- 由 []
:
DateTimeFormatter fmt = DateTimeFormatter
.ofPattern("MM/dd/yyyy[ hh:mm[[:ss][ ]a]][HH:mm]", Locale.US);
如果您只想验证输入 - 而不是将结果分配给 date/time 变量 - 只需调用 parse
就足够了。这适用于以下所有情况:
fmt.parse("10/20/2018");
fmt.parse("10/20/2018 10:20");
fmt.parse("10/20/2018 10:20AM");
fmt.parse("10/20/2018 10:20 AM");
fmt.parse("10/20/2018 10:20:30AM");
fmt.parse("10/20/2018 10:20:30 AM");
如果输入无效,它会抛出一个DateTimeParseException
。
注意there's a difference between HH
and hh
。 H
用于 hour-of-day(值介于 0 和 23 之间),而 h
用于 clock-hour-of-am-pm(值介于 1 和 12 之间)。 H
不能和 AM/PM 指示符一起使用,而 h
必须有 AM/PM 来消除歧义。这就是为什么有 2 个不同的可选部分,每个部分一个。
我也使用 Locale.US
因为 AM/PM 字符串是本地化的。虽然对于大多数语言环境,结果是 "AM" 或 "PM",但对于其他一些语言环境,它可以是小写 ("am"),或一些其他值(例如,日语中的 午後
).
如果您不设置语言环境,它将使用 JVM 默认设置。但我更喜欢将它设置为特定的,我知道它会与我的输入一起工作。
要再次打印所有字段的这些值,有点棘手。
输入只能有日期(日、月、年)或日期和时间(日、月、年、小时、分钟),因此一种替代方法是使用 LocalDateTime
(并设置缺失的字段当不存在时)。
您可以使用 parseBest
然后检查解析的类型:
// parse, try to create a LocalDateTime - if it's not possible, try a LocalDate
TemporalAccessor parsed = fmt.parseBest("10/20/2018", LocalDateTime::from, LocalDate::from);
LocalDateTime dt = null;
if (parsed instanceof LocalDateTime) {
// LocalDateTime parsed (all fields set)
dt = (LocalDateTime) parsed;
} else if (parsed instanceof LocalDate) {
// LocalDate parsed (set time fields)
dt = ((LocalDate) parsed)
// set time (use whatever value you want - I'm using 10 AM as example)
.atTime(LocalTime.of(10, 0));
}
然后您使用另一个格式化程序进行输出 - 这是因为第一个格式化程序将在格式化时打印所有可选部分,所以它会打印两次小时。只需创建另一个即可:
DateTimeFormatter outputFmt = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a", Locale.US);
System.out.println(dt.format(outputFmt)); // 10/20/2018 10:00:00 AM