String to LocalDate --> 在 toString 中格式化
String to LocalDate --> formatting in toString
有一个文本文件,我是用split的方法来切的。一切都很好,除了格式化我有问题。预期输出格式:
Ime: John , Prezime: Davidson , Datum rodjenja: 05.maj.1988, Mesto
rodjenja: Belgrade
日期必须是“05.may.1988”。相反,我将其作为输入文件中的 05051988
获取。
我的错误在哪里?解决方案是什么?
Persons person = new Persons();
String text = "John.Davidson/05051988/Belgrade Michael.Barton/01011968/Krakov Ivan.Perkinson/23051986/Moscow";
String[] valami = text.split("[ ./]+");
for(int i=0; i < valami.length; i+=4) {
person.name = valami[i];
person.lastName = valami[i+1];
person.dateBirth = valami[i+2];
person.Birthplace = valami[i+3];
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ddMMyyyy");
LocalDate ld = LocalDate.parse(dateBirth, dtf) ;
System.out.println(person);
}
人class:
@Override
public String toString () {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MMM.yyyy.");
String s = dateBirth.format(dtf);
return "Ime: " + this.name + " , "
+ "Prezime: " + this.lastName + " , "
+ "Datum rodjenja: " + this.dateBirth + " , "
+ "Mesto rodjenja: " + this.Birthplace;
}
您需要将日期字符串格式化为 LocalDate,然后将其格式化为您想要的字符串模式。参见 API Docks for parsing and formatting here
private static final DateTimeFormatter BIRTDATE_FORMAT = DateTimeFormatter.ofPattern("dd.MMMM.yyyy");
private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ddMMyyyy");
person.dateBirth = LocalDate.parse(valami[i+2], dtf).format(BIRTDATE_FORMAT);
将打印:
Ime: John , Prezime: Davidson , Datum rodjenja: 05.May.1988 , Mesto rodjenja: Belgrade
据我从您的代码片段中得知,您的出生日期与输入格式相同,例如 05051988
,原因如下:
- 您正在将出生日期解析为
LocalDate
,但从未将 LocalDate
保存到人员对象中,因此从未使用过。
- 在
toString()
中,您试图将日期格式化为字符串 s
,但由于 dateBirth
是一个字符串,而不是 LocalDate
,它不起作用.而且你没有使用 s
做任何事情。
解决问题我建议:
在Persons
声明dateBirth
一个LocalDate
:
private LocalDate dateBirth;
LocalDate
更适合您的模型。字符串非常适合读取数据并将它们呈现给用户。您可以添加一个方便的 setter 以便您可以从拆分输入中存储字符串:
private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ddMMyyyy");
private void setDateBirth(String dateBirthString) {
this.dateBirth = LocalDate.parse(dateBirthString, dtf);
}
这样调用:
person.setDateBirth(valami[i+2]);
现在 toString
您可以将日期格式化回字符串:
return "Ime: " + this.name + " , "
+ "Prezime: " + this.lastName + " , "
+ "Datum rodjenja: " + this.dateBirth.format(dtf) + " , "
+ "Mesto rodjenja: " + this.birthplace;
您可能还想告诉格式化程序使用哪个语言环境,例如:
DateTimeFormatter dtf
= DateTimeFormatter.ofPattern("dd.MMM.yyyy.", Locale.forLanguageTag("bs"));
通过以上更改,您的代码片段打印:
Ime: John , Prezime: Davidson , Datum rodjenja: 05.maj.1988. , Mesto rodjenja: Belgrade
Ime: Michael , Prezime: Barton , Datum rodjenja: 01.jan.1968. , Mesto rodjenja: Krakov
Ime: Ivan , Prezime: Perkinson , Datum rodjenja: 23.maj.1986. , Mesto rodjenja: Moscow
进一步的建议:
- 将您的 class
Person
命名为单数,因为 class 的对象只代表一个人。
- 声明一个接受名字、姓氏、出生日期和出生地点的构造函数,这样您就不必单独设置它们。然后将字段(实例变量)声明为私有。
有一个文本文件,我是用split的方法来切的。一切都很好,除了格式化我有问题。预期输出格式:
Ime: John , Prezime: Davidson , Datum rodjenja: 05.maj.1988, Mesto rodjenja: Belgrade
日期必须是“05.may.1988”。相反,我将其作为输入文件中的 05051988
获取。
我的错误在哪里?解决方案是什么?
Persons person = new Persons();
String text = "John.Davidson/05051988/Belgrade Michael.Barton/01011968/Krakov Ivan.Perkinson/23051986/Moscow";
String[] valami = text.split("[ ./]+");
for(int i=0; i < valami.length; i+=4) {
person.name = valami[i];
person.lastName = valami[i+1];
person.dateBirth = valami[i+2];
person.Birthplace = valami[i+3];
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ddMMyyyy");
LocalDate ld = LocalDate.parse(dateBirth, dtf) ;
System.out.println(person);
}
人class:
@Override
public String toString () {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MMM.yyyy.");
String s = dateBirth.format(dtf);
return "Ime: " + this.name + " , "
+ "Prezime: " + this.lastName + " , "
+ "Datum rodjenja: " + this.dateBirth + " , "
+ "Mesto rodjenja: " + this.Birthplace;
}
您需要将日期字符串格式化为 LocalDate,然后将其格式化为您想要的字符串模式。参见 API Docks for parsing and formatting here
private static final DateTimeFormatter BIRTDATE_FORMAT = DateTimeFormatter.ofPattern("dd.MMMM.yyyy");
private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ddMMyyyy");
person.dateBirth = LocalDate.parse(valami[i+2], dtf).format(BIRTDATE_FORMAT);
将打印:
Ime: John , Prezime: Davidson , Datum rodjenja: 05.May.1988 , Mesto rodjenja: Belgrade
据我从您的代码片段中得知,您的出生日期与输入格式相同,例如 05051988
,原因如下:
- 您正在将出生日期解析为
LocalDate
,但从未将LocalDate
保存到人员对象中,因此从未使用过。 - 在
toString()
中,您试图将日期格式化为字符串s
,但由于dateBirth
是一个字符串,而不是LocalDate
,它不起作用.而且你没有使用s
做任何事情。
解决问题我建议:
在Persons
声明dateBirth
一个LocalDate
:
private LocalDate dateBirth;
LocalDate
更适合您的模型。字符串非常适合读取数据并将它们呈现给用户。您可以添加一个方便的 setter 以便您可以从拆分输入中存储字符串:
private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ddMMyyyy");
private void setDateBirth(String dateBirthString) {
this.dateBirth = LocalDate.parse(dateBirthString, dtf);
}
这样调用:
person.setDateBirth(valami[i+2]);
现在 toString
您可以将日期格式化回字符串:
return "Ime: " + this.name + " , "
+ "Prezime: " + this.lastName + " , "
+ "Datum rodjenja: " + this.dateBirth.format(dtf) + " , "
+ "Mesto rodjenja: " + this.birthplace;
您可能还想告诉格式化程序使用哪个语言环境,例如:
DateTimeFormatter dtf
= DateTimeFormatter.ofPattern("dd.MMM.yyyy.", Locale.forLanguageTag("bs"));
通过以上更改,您的代码片段打印:
Ime: John , Prezime: Davidson , Datum rodjenja: 05.maj.1988. , Mesto rodjenja: Belgrade
Ime: Michael , Prezime: Barton , Datum rodjenja: 01.jan.1968. , Mesto rodjenja: Krakov
Ime: Ivan , Prezime: Perkinson , Datum rodjenja: 23.maj.1986. , Mesto rodjenja: Moscow
进一步的建议:
- 将您的 class
Person
命名为单数,因为 class 的对象只代表一个人。 - 声明一个接受名字、姓氏、出生日期和出生地点的构造函数,这样您就不必单独设置它们。然后将字段(实例变量)声明为私有。