为什么java会让我们写更多代码?

问题描述 投票:-1回答:2

为什么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 date
2个回答
5
投票

为什么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()

...因为calendar.getTime()不返回java.util.Date的新实例?

它正是如此。这是JDK 10中的实现:

public final Date getTime() {
    return new Date(getTimeInMillis());
}

链接

Oracle tutorial: Date Time解释如何使用java.time


7
投票

Calendar.getTime()返回一个新的Date实例,因此尝试更改返回对象的值是徒劳的,它对Calendar实例没有影响。

看看来源:

public final Date getTime() {
    return new Date(getTimeInMillis());
}

这清楚地表明,在返回日期更改任何内容不会更改日历对象本身。

您可以进行更改,然后使用修改日期调用calendar.setTime来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.