我创建了一个名为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
答案 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午夜可以用多种不同的格式表示/显示:
虽然上面的所有格式都不同,但代表相同的日期和时间。各个字段(日,月,年,小时,秒等)的值是相同的,因此都表示相同的日期/时间值(在这种情况下,相同的{{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