Java LocalDateTime格式问题

时间:2017-08-06 17:46:57

标签: java datetime java-time formatter

我创建了一个名为Observation的类,其构造函数将CSV文件的一行作为输入。我提取了LocalDateTime但是,它没有按照我的意图格式化。

public class Observation {

    private String date, time, datetimeStr;
    private LocalDateTime dateTime;

    private static DateTimeFormatter FORMAT = DateTimeFormatter.ofPattern("dd-MMM-yy HH:mm"); 

    public Observation(String line) {
        String[] parts = line.trim().split(",");
        if (parts.length != 14) {
            throw new InputMismatchException("Error: Invalid data!");
        }

        date = String.valueOf(parts[6]);
        time = String.valueOf(parts[7]);
        dateTimeStr = date + " " + time;
        dateTime = LocalDateTime.parse(dateTimeStr, FORMAT);
    }

    // DateTime Getter
    public LocalDateTime getDateTime() {
      return dateTime;
    }

    public static void main(String[] args) {
        String input= "Leeds,Albion Street North,2017,March,13,Saturday,01-Apr-17,00:00,197,0,197,197,0,197";

        Observation test = new Observation(input);

        // Print out DateTime
        System.out.println("Date-Time: " + test.getDateTime());

    }
}

所以我希望它的格式为"01-Apr-17 00:00",我使用上面指定的格式化程序"dd-MMM-yy HH:mm"

当我使用dateTime getter时,我从终端获得的结果是:

Ashs-MacBook-Pro:resit asheastham$ Java ObservationTest
Date-Time: 2017-04-01T00:00

2 个答案:

答案 0 :(得分:0)

与您的假设LocalDateTime.parse(dateTimeStr, FORMAT) does not parse _and format_ the contents of dateTimeStr`相反,但仅解析日期时间值,期望它具有您在FORMAT中指定的格式。

输出时需要格式化日期时间值:

public static void main(String[] args) {
  String input= "Leeds,Albion Street North,2017,March,13,Saturday,01-Apr-17,00:00,197,0,197,197,0,197";

  Observation test = new Observation(input);

  // Print out DateTime
  System.out.println("Date-Time: " + FORMAT.format(test.getDateTime()));

}

这会生成所需的输出:

Date-Time: 01-Apr-17 00:00

答案 1 :(得分:0)

我认为你在两个不同的概念之间混淆了#34;当涉及到日期:日期对象的,以及某种特定格式的此值的表示

LocalDateTime对象表示日期/时间:它保持日,月,年,小时,分钟,秒和纳秒的。但是日期本身has no format at all - 此链接大约是java.util.Date,但日期没有格式的一般概念也适用于LocalDateTime

LocalDateTime对象只有与日期和时间对应的值,但这些值可以以多种不同的方式显示。而那些不同的方式与价值观本身无关。因此,日期/时间 4月1日 st 2017午夜可以用多种不同的格式表示/显示:

  • 4月1日 st 2017 00:00:00
  • 01/04/2017 0:00
  • 01-Apr-17 00:00
  • 2017-04-01T00:00
  • 和其他许多人......

虽然上面的所有格式都不同,但代表相同的日期和时间。各个字段(日,月,年,小时,秒等)的是相同的,因此都表示相同的日期/时间值(在这种情况下,相同的{{1} })。

执行LocalDateTime后,您要将特定的格式转换为日期值(在本例中为LocalDateTime.parse(dateTimeStr, FORMAT))。此操作称为解析:获取特定格式LocalDateTime(文本)并将其转换为日期/时间

创建的String指定了格式:

DateTimeFormatter

这意味着要解析的FORMAT = DateTimeFormatter.ofPattern("dd-MMM-yy HH:mm") 将采用指定的格式 - 在这种情况下,String(带有2位数的日期),然后是dd,然后是{{ 1}}(月短名称)等等。 javadoc包含有关所有可用模式的详细信息。

当你这样做时:

-

此代码隐含性调用MMM的{​​{1}}方法,此方法returns the date/time in a specific format

  

将此日期时间输出为字符串,例如2007-12-03T10:15:30。   输出将是以下ISO-8601格式之一:

     

UUUU-MM-DD' T' HH:MM
  UUUU-MM-DD' T' HH:MM:SS
  UUUU-MM-DD' T' HH:MM:SS.SSS
  UUUU-MM-DD' T' HH:MM:SS.SSSSSS
  UUUU-MM-DD' T' HH:MM:ss.SSSSSSSSS

     

使用的格式是最短的,输出省略的部分隐含为零的时间的全部值

这就是为什么您的计划将日期输出为System.out.println("Date-Time: " + test.getDateTime()); :这是toString()方法的结果。

如果您想以LocalDateTime格式打印2017-04-01T00:00,则应致电LocalDateTime::toString()(已在this answer中说明)。

如果您同时需要LocalDateTime(存储它,as you said in the comments)和指定格式的日期,并且在构造函数中执行所有操作,则必须保留2个不同的字段(一个{{1 }和一个01-Apr-17 00:00)。

实际上,你已经在做了。您的FORMAT.format(test.getDateTime())字段已包含所需格式的日期,因此只需为其创建一个getter。或者创建另一个返回LocalDateTime的方法(如LocalDateTime)。然后你将有2个方法:一个返回String(当你需要日期对象时,比如存储它时),另一个返回格式化dateTimeStr(当你需要打印时)它)。

还有一件事:月份名称(" 4月和#34;)是英文的。您的代码正在运行,因为JVM的默认语言环境也是英语,但不能保证它始终如此。默认语言环境可以在不事先通知的情况下进行更改,即使在运行时也是如此(同一JVM中的某些其他应用程序可以调用getFormattedDateTime(),或者有人可能会错误配置JVM,并且您的代码会突然中断)。

为避免这种情况,您可以使用FORMAT.format(this.dateTime)设置格式化程序,并明确表示您使用的是英语:

LocalDateTime