Java日期时间格式检查和重置

字符串是一个输入,我必须检查它是否是这些格式中的任何一种。如果它是 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 中?我可以使用标记为重复的链接,它讨论如何解析,但我有额外的要求作为自动完成缺少格式。

q112

在 Java 8 中,您可以使用java.time.format.DateTimeFormatter带有许多可选部分的 a - 由 分隔[]

DateTimeFormatter fmt = DateTimeFormatter
    .ofPattern("MM/dd/yyyy[ hh:mm[[:ss][ ]a]][HH:mm]", Locale.US);

如果您只想验证输入 - 并且不将结果分配给日期/时间变量 - 只需调用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.

请注意,之间存在差异HHhhH用于一天中的小时(值介于 0 和 23 之间),而h用于时钟小时的上午 - 下午(值介于 1 和 12 之间)。H不能带有 AM/PM 指示符,而h必须有 AM/PM 来消除歧义。这就是为什么有 2 个不同的可选部分,每个字段一个。

我也使用,Locale.US因为 AM/PM 字符串是本地化的。尽管对于大多数语言环境,结果是“AM”或“PM”,但对于其他一些语言环境,它可以是小写字母(“am”)或其他一些值(午後例如日语)。

如果您不设置语言环境,它将使用 JVM 默认值。但我更喜欢将它设置为一个特定的,我知道它可以与我拥有的输入一起使用。


要再次打印这些值,以及所有字段,这有点棘手。输入只能有日期(日、月、年)或日期和时间(日、月、年、小时、分钟),因此一种替代方法是使用 a 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

时间和日期检查

来自分类Dev

时间和日期检查

来自分类Dev

用Java解析和格式化日期和时间

来自分类Dev

解码时间和日期格式

来自分类Dev

Python日期和时间格式

来自分类Dev

日期和时间格式错误

来自分类Dev

java / SimpleDateFormat类中的日期和时间格式/模式

来自分类Dev

Java 正则表达式检查日期和时间

来自分类Dev

Java日期和时间

来自分类Dev

用电话检查日期和时间日期和时间

来自分类Dev

如何在Java中检查字符串是否为日期时间格式

来自分类Dev

更改日期和时间格式

来自分类Dev

更改Windows时间和日期格式

来自分类Dev

解析日期和时间格式-Bash

来自分类Dev

Fabric日志格式以显示日期和时间

来自分类Dev

24小时格式的日期和时间

来自分类Dev

使用awk填充日期和时间格式

来自分类Dev

R:如何定义日期和时间格式

来自分类Dev

以特定格式解析日期和时间

来自分类Dev

Alfresco:更改日期和时间格式

来自分类Dev

Django Ajax响应日期和时间格式

来自分类Dev

如何输入日期和时间格式

来自分类Dev

Google Calendar API日期和时间格式

来自分类Dev

CodeIgniter 3 漂亮的日期和时间格式

来自分类Dev

检查日期和时间是否重叠

来自分类Dev

Windows 7:系统日期和时间重置为2007

来自分类Dev

Java日期和时间转换

来自分类Dev

如何检查字符串中的日期时间格式?

来自分类Dev

获取日期时间格式的列,并检查其中是否包含值