为什么java会让我们写更多代码?例如:
long time = 1509694664442L;
Calendar c = Calendar.getInstance();
System.out.println(c.getTime());
c.getTime().setTime(time); // doesn't update the calendar's time!
System.out.println(c.getTime());
// but this does
Date d = c.getTime();
d.setTime(time);
c.setTime(d);
System.out.println(c.getTime());
输出:
Fri Jun 22 16:30:06 BRT 2018
Fri Jun 22 16:30:06 BRT 2018
Fri Nov 03 04:37:44 BRT 2017
有人可以解释为什么会发生这种情况,因为calendar.getTime()不会返回java.util.Date的新实例吗?
为什么java会让我们编写比正常更多的代码?
因为您使用的是旧的和过时的日期和时间类。 java.time
,现代Java日期和时间API,不仅允许更简洁,而且更清晰的代码:
long time = 1_509_694_664_442L;
Instant i = Instant.ofEpochMilli(time);
System.out.println(i);
或者,因为你要求简洁:
Instant.ofEpochMilli( 1_509_694_664_442L ).toString()
输出:
2017-11-03t 07:37:44.442克
对于更人性化的东西(对于我们中的一些人来说:-)
ZoneId zone = ZoneId.of("America/Recife");
Locale brazil = Locale.forLanguageTag("pt-BR");
DateTimeFormatter formatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.FULL)
.withLocale(brazil);
String formatted = i.atZone(zone).format(formatter);
System.out.println(formatted);
2017年11月3日星期五04:37:44巴西利亚标准时间
...因为calendar.getTime()不返回java.util.Date的新实例?
它正是如此。这是JDK 10中的实现:
public final Date getTime() {
return new Date(getTimeInMillis());
}
Oracle tutorial: Date Time解释如何使用java.time
。
Calendar.getTime()
返回一个新的Date
实例,因此尝试更改返回对象的值是徒劳的,它对Calendar
实例没有影响。
看看来源:
public final Date getTime() {
return new Date(getTimeInMillis());
}
这清楚地表明,在返回日期更改任何内容不会更改日历对象本身。
您可以进行更改,然后使用修改日期调用calendar.setTime
来解决此问题。