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 的对象只代表一个人。
  • 声明一个接受名字、姓氏、出生日期和出生地点的构造函数,这样您就不必单独设置它们。然后将字段(实例变量)声明为私有。