Java 日期解析的问题

Java 日期解析的问题,java,parsing,Java,Parsing,晚上好,请告诉我如何解决日期解析的问题。 数据以txt格式写入。文件,当我读取并解析包含对象日期的文件时,会抛出一个日期错误,请帮助我修复它。我只使用javaCore public class DemoRoom { public static SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); public static void main(String[] args) throws Exc

晚上好,请告诉我如何解决日期解析的问题。 数据以txt格式写入。文件,当我读取并解析包含对象日期的文件时,会抛出一个日期错误,请帮助我修复它。我只使用javaCore

public class DemoRoom {

public static SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");

public static void main(String[] args) throws Exception {
    Path path = new Path();
    RoomRepository roomRepository = new RoomRepository();


    Hotel hotel1 = new Hotel(1L, "Ajax", "Holland", "Amsterdam", "Amsterdamskaja");
    Hotel hotel2 = new Hotel(2L, "Slask", "Poland", "Wroclaw", "Wroclawskaja");
    Hotel hotel3 = new Hotel(3L, "Dynamo", "Ukraine", "Kyiv", "Obolonskaja");


    String newDate1 = "07-Jun-2019";
    String newDate2 = "10-Nov-2020";
    String newDate3 = "31-Dec-2020";

    Room room1 = new Room(1L, 2, 200.0, false, false, dateFormat.parse(newDate1), hotel1);
    Room room2 = new Room(2L, 5, 1900.99, true, true, dateFormat.parse(newDate2), hotel2);
    Room room3 = new Room(3L, 1, 499.99, true, false, dateFormat.parse(newDate3), hotel3);

    
    roomRepository.addRoom(room1, path.getRoomDB());
解析 日期在第五项下

    @Override
public Room pars(String str) throws Exception {
    if (str == null)
        throw new Exception("String does not exist!");
    String[] arr = str.split(",");
    Room room = new Room();
    room.setId(Long.parseLong(arr[0]));
    room.setNumberOfGuests(Integer.parseInt(arr[1]));
    room.setPrice(Double.parseDouble(arr[2]));
    room.setBreakfastIncluded(Boolean.parseBoolean(arr[3]));
    room.setPetsAllowed(Boolean.parseBoolean(arr[4]));
    room.setDateAvailableFrom(DemoRoom.dateFormat.parse(arr[5]));
    new HotelRepository().findHotelById((arr[6]));
    return room;
}
结果

当您运行下面显示的代码时,将调用一个方法,该方法返回SimpleDataFormat的新实例,该实例使用默认构造函数,而不是定义所需格式的构造函数dd MMM yyyy

    dateFormat.getInstance().parse(newDate1);
删除getInstance部分,您将获得金牌


当您运行下面显示的代码时,将调用一个方法,该方法返回一个SimpleDataFormat的新实例,该实例使用默认构造函数而不是定义所需格式的构造函数dd MMM yyyy

    dateFormat.getInstance().parse(newDate1);
删除getInstance部分,您将获得金牌

java.time 您正在使用可怕的日期时间类,这些类在几年前被现代java.time框架所取代。切勿使用日期、日历、SimpleDateFormat等

本地日期 对于没有时间和时区的仅日期值,请使用类

避免使用本地化格式以文本方式交换日期时间值。交换字符串时,仅使用标准格式。对于仅日期值,该格式为YYYY-MM-DD。默认情况下,java.time类使用ISO 8601格式,因此无需指定格式模式

LocalDate localDate = LocalDate.parse( "2019-06-07" ) ;
如果必须解析本地化字符串,请让DateTimeFormatter完成这项工作

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" ) ;
指定用于分析月份名称的区域设置

Locale locale = Locale.US ;  
f = f.withLocale( locale ) ;
解析传入的数据

String input = "07-Jun-2019" ; 
LocalDate localDate = LocalDate.parse( input , f ) ;
您的Room类应包含LocalDate类型的成员字段

并在传递给构造函数之前很好地解析输入。您应该总是期望有错误的输入

try{
    LocalDate localDate = LocalDate.parse( input , f ) ;
    …
} catch ( DateTimeParseException e ) {
    … 
}
java.time 您正在使用可怕的日期时间类,这些类在几年前被现代java.time框架所取代。切勿使用日期、日历、SimpleDateFormat等

本地日期 对于没有时间和时区的仅日期值,请使用类

避免使用本地化格式以文本方式交换日期时间值。交换字符串时,仅使用标准格式。对于仅日期值,该格式为YYYY-MM-DD。默认情况下,java.time类使用ISO 8601格式,因此无需指定格式模式

LocalDate localDate = LocalDate.parse( "2019-06-07" ) ;
如果必须解析本地化字符串,请让DateTimeFormatter完成这项工作

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" ) ;
指定用于分析月份名称的区域设置

Locale locale = Locale.US ;  
f = f.withLocale( locale ) ;
解析传入的数据

String input = "07-Jun-2019" ; 
LocalDate localDate = LocalDate.parse( input , f ) ;
您的Room类应包含LocalDate类型的成员字段

并在传递给构造函数之前很好地解析输入。您应该总是期望有错误的输入

try{
    LocalDate localDate = LocalDate.parse( input , f ) ;
    …
} catch ( DateTimeParseException e ) {
    … 
}

为什么不像第一个示例中那样使用SimpleDataFormat类?@MironBalcerzak我试过了,它在两个房间都不起作用。SetDateAvailableFromsImpleDataFormat.getInstance.parsearr[5];看看我的答案@MironBalcerzak指的是为什么调用getInstance。为什么不像第一个示例中那样使用SimpleDateFormat类?@MironBalcerzak我试过了,但两个房间都不起作用。setDateAvailableFromSimpleDateFormat.getInstance.parsearr[5];看看我的答案@MironBalcerzak指的是为什么调用getInstance。但是当我尝试删除getInstance时,我得到了一个错误。没有它,我无法调用解析器。怎么办?@NikZim您需要传递在代码前面创建的dateFormat实例。如果要调用DateFormat的静态方法来获取默认实例,则需要调用DateFormat类的实例,因为只有实例知道样式..MMM。。您设置的。我将dateFormat设置为静态字段。将其传递给解析器,但仍然不起作用。公共静态SimpleDataFormat dateFormat=新SimpleDataFormatD MMM yyyy;方法pars room.setDateAvailableFromDemoRoom.dateFormat.parsearr[5];线程main java.text.ParseException:不可解析日期:2019年6月7日在java.base/java.text.DateFormat.parseDateFormat.java:396在Demo.DemoRoom.maindmoroom.java:32你能用DateFormat的全部代码更新原始帖子吗?你仍然没有显示调用DateFormat的部分。您调用的是DateFormat.parse,而不是DateFormat.parse……但是当我尝试删除getInstance时,出现了一个错误。没有它,我无法调用解析器。怎么办?@NikZim您需要传递在代码前面创建的dateFormat实例。如果要调用DateFormat的静态方法来获取默认实例,则需要调用DateFormat类的实例,因为只有实例知道样式..MMM。。您设置的。我将dateFormat设置为静态字段。将其传递给解析器,但仍然不起作用。公共静态SimpleDataFormat dateFormat=新SimpleDataFormatD MMM yyyy;方法pars room.setDateAvailableFromDemoRoom.dateFormat.parsearr[5];主线程java.text.ParseException中的异常:不可解析日期:2019年6月7日,位于java.base/java.text.DateFormat.parseDateFormat.java:396
在Demo.DemoRoom.maindmoroom.java:32,您能用dateformat的全部代码更新原始帖子吗?您仍然没有显示调用dateformat的部分。您正在调用DateFormat.parse而不是DateFormat.parse…非常感谢,我不知道我会解决它。非常感谢,我不知道我会解决它。