字符串到LocalDate - >在toString中格式化

时间:2018-03-02 14:43:13

标签: java string date-format

有一个文本文件,我使用拆分方法来剪切。一切都没关系,除了格式化我有问题。预期的输出格式:

  

Ime:John,Prezime:Davidson,Datum rodjenja:05.maj.1988,Mesto   rodjenja:贝尔格莱德

日期必须为“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);
}

人类:

@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;
}

2 个答案:

答案 0 :(得分:2)

根据我的摘要,您的出生日期与输入格式相同,例如05051988,因为以下问题:

  • 您正在将出生日期解析为LocalDate,但从未将LocalDate保存到人物对象中,因此永远不会使用它。
  • toString()中,您尝试将日期格式化为字符串s,但由于dateBirth是字符串,而不是LocalDate,因此无效。此外,您还没有使用s

要解决我建议的问题:

Persons声明dateBirth a LocalDate

private LocalDate dateBirth;

LocalDate对您的模型更好。字符串可用于读取数据并将其呈现给用户。您可以添加便利设置器,以便可以从拆分输入中存储字符串:

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

进一步的建议:

  • 以单数形式命名您的班级Person,因为班级的一个对象只代表一个人。
  • 声明一个接受名字,姓氏,出生日期和出生地的构造函数,这样您就不必单独设置它们。然后将字段(实例变量)声明为private。

答案 1 :(得分:1)

您需要将日期字符串格式化为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