我们在应用程序中具有一致的 ZonedDateTime 类型,因此我们不需要
更愿意改变这一点。
为什么你认为2011-01-19T04:00Z[UTC]
不一致吗?日期时间对象应该仅保存(并提供操作的方法/函数)日期、时间和时区信息。它不应该存储任何格式信息;否则将违反单一职责原则 https://en.wikipedia.org/wiki/Single-responsibility_principle。格式化应该由格式化类处理,例如日期时间格式化程序 (用于现代日期时间 API https://www.oracle.com/technical-resources/articles/java/jf14-date-time.html), DateFormat
(对于遗产java.util
日期时间 API)等
每个类都应该覆盖toString()
功能;否则,Object#toString
当其对象被打印时将被返回。 AZonedDateTime
有日期、时间和时区信息。下面给出的是它的方式toString()
对于时间部分已经实施:
@Override
public String toString() {
StringBuilder buf = new StringBuilder(18);
int hourValue = hour;
int minuteValue = minute;
int secondValue = second;
int nanoValue = nano;
buf.append(hourValue < 10 ? "0" : "").append(hourValue)
.append(minuteValue < 10 ? ":0" : ":").append(minuteValue);
if (secondValue > 0 || nanoValue > 0) {
buf.append(secondValue < 10 ? ":0" : ":").append(secondValue);
if (nanoValue > 0) {
buf.append('.');
if (nanoValue % 1000_000 == 0) {
buf.append(Integer.toString((nanoValue / 1000_000) + 1000).substring(1));
} else if (nanoValue % 1000 == 0) {
buf.append(Integer.toString((nanoValue / 1000) + 1000_000).substring(1));
} else {
buf.append(Integer.toString((nanoValue) + 1000_000_000).substring(1));
}
}
}
return buf.toString();
}
正如您所看到的,只有当第二个和纳米部分大于时,它们才会包含在返回的字符串中0
。这意味着如果您希望输出字符串中包含这些(第二个和纳米)零,则需要使用格式化类。下面给出一个示例:
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String input = "1/19/2011 4:00:00.000000 AM";
// Formatter for input string
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("M/d/u H:m:s.n a")
.toFormatter(Locale.ENGLISH);
ZonedDateTime zdt = LocalDateTime.parse(input, inputFormatter).atZone(ZoneOffset.UTC);
// Print `zdt` in default format i.e. the string returned by `zdt.toString()`
System.out.println(zdt);
// Formatter for input string
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.nnnnnnz");
String output = zdt.format(outputFormatter);
System.out.println(output);
}
}
Output:
2011-01-19T04:00Z
2011-01-19T04:00:00.000000Z
值得思考的地方:
public class Main {
public static void main(String[] args) {
double d = 5.0000;
System.out.println(d);
}
}
您期望从上面给出的代码中得到什么输出?做5.0
代表一个不同于的值5.0000
?您将如何打印5.0000
? [提示:检查String#format
, NumberFormat
, BigDecimal
etc.]