regex 如何验证日期和时间格式与时区?

ovfsdjhp  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(250)

我需要确保使用以下格式之一写入日期:2023年1月6日11:59 PM ET2023年1月6日11:59 PM ET
我尝试使用下面的正则表达式,但它没有工作:

^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})Z$

有人可以请帮助我与regex,让我知道如何才能实现我的日期和时间的理想格式?

gjmwrych

gjmwrych1#

* Java时间 *

您可以使用 java.time 类,而不是使用regex
为每个预期输入指定一个DateTimeFormatter对象。尝试使用其中的每个对象分析输入。如果引发DateTimeParseException,则表示输入与该格式化程序不匹配-请继续处理下一个格式化程序。如果没有异常,则表示匹配。如果所有格式化程序都引发异常,则表示输入意外无效。
在大多数情况下,你应该 * 从不 * swallow an exception。但是这里有一个例外;这是有意义的。2我们预计3个格式化器中至少有2个会解析失败,也有可能是全部。
第二个例子很特别,因为它结合了一天中的时间和伪时区ET,Java确实包含了一个类OffsetTime,用于结合了UTC的偏移量的时间,但是(a)该类在逻辑上没有意义;我认为包含该类仅仅是为了与SQL standard中定义的相同的不合逻辑的数据类型兼容。并且,(b)您的输入使用伪time zone,而不是offset。为了解决这个难题,我使用LocalTime类,它只表示一天中的时间,没有日期,没有时区,没有偏移。

package work.basil.example.time;

import java.time.format.*;
import java.time.*;
import java.util.List;
import java.util.Locale;

public class App5
{
    public static void main ( String[] args )
    {
        App5 app = new App5();
        app.demo();
    }

    private void demo ( )
    {
        List < String > inputs =
                List.of(
                        "06-01-2023" ,
                        "11:59 PM ET" ,
                        "06/01/2023 11:59 PM ET" ,
                        "bogus"
                );
        for ( String input : inputs )
        {
            // LocalDate
            try
            {
                LocalDate localDate = LocalDate.parse( input , DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) );
                System.out.println( "Found a match for LocalDate: " + localDate );
                continue;
            }
            catch ( DateTimeParseException e )
            {
                // Ignore here. Try other formatters.
            }

            // LocalTime
            try
            {
                LocalTime localTime = LocalTime.parse( input , DateTimeFormatter.ofPattern( "hh:mm a v" ).withLocale( Locale.US ) );
                System.out.println( "Found a match for OffsetTime: " + localTime );
                continue;
            }
            catch ( DateTimeParseException e )
            {
                // Ignore here. Try other formatters.
            }

            // ZonedDateTime
            try
            {
                ZonedDateTime zdt = ZonedDateTime.parse( input , DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm a v" ).withLocale( Locale.US ) );
                System.out.println( "Found a match for ZonedDateTime: " + zdt );
                continue;
            }
            catch ( DateTimeParseException e )
            {
                // Ignore here. Try other formatters.
            }

            // Reaching this point means the input in unexpected, invalid. 
            System.out.println( "ERROR - Input is invalid: " + input );
        }
    }
}

运行时:

Found a match for LocalDate: 2023-01-06
Found a match for OffsetTime: 23:59
Found a match for ZonedDateTime: 2023-06-01T23:59-04:00[America/New_York]
ERROR - Input is invalid: bogus

ISO 8601标准

仅供参考,这种自定义本地化格式是以文本方式传递日期-时间值的一种糟糕方式。请向数据发布者介绍使用标准ISO 8601进行数据交换和数据存储的优点。

相关问题