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
1条答案
按热度按时间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
类,它只表示一天中的时间,没有日期,没有时区,没有偏移。运行时:
ISO 8601标准
仅供参考,这种自定义本地化格式是以文本方式传递日期-时间值的一种糟糕方式。请向数据发布者介绍使用标准ISO 8601进行数据交换和数据存储的优点。