如果在 java-11 使用 ZonedDateTime 时数据库日期时间为 0,则默认情况下会截断数据库日期时间毫秒和纳秒
Databse DateTime milli & nano seconds are truncated by default if its 0s while using it in java-11 using ZonedDateTime
我正在从 oracle 数据库中获取日期时间并使用 ZonedDateTime 在 java-11 中进行解析,如下所示:
甲骨文 --> 1/19/2020 06:09:46.038631 PM
java ZonedDateTime 0/p --> 2020-01-19T18:09:46.038631Z[UTC]
甲骨文 --> 1/19/2011 4:00:00.000000 AM
java ZonedDateTime o/p --> 2011-01-19T04:00Z[UTC]
(因此,默认情况下会截断 0。
但是,我的要求是像#1 一样具有一致的固定长度 o/p。)
预期java ZonedDateTime o/p --> 2011-01-19T04:00:00.000000Z[UTC]
但是,我没有找到任何日期 api 方法来实现上述预期 o/p。有什么方法可以保留固定长度的尾随 0,而不是操纵字符串。
我们在应用程序中具有一致的 ZonedDateTime 类型,因此我们不希望更改它。
We have consistent ZonedDateTime type in application, so we do not
prefer to change that.
为什么您认为 2011-01-19T04:00Z[UTC]
不一致? date-time 对象应该只保存(并提供 methods/functions 操作)日期、时间和 time-zone 信息。它不应该存储任何格式信息;否则,它将违反 Single-responsibility principle. The formatting should be handled by a formating class e.g. DateTimeFormatter (for modern date-time API)、DateFormat
(旧版 java.util
date-time API)等
每个 class 都应该覆盖 toString()
函数;否则,将在打印其对象时返回 Object#toString
。 ZonedDateTime
有日期、时间和 time-zone 信息。下面给出了 time-part 的 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
时,第二和纳米部分才会包含在返回的字符串中。这意味着如果你想在输出字符串中使用这些(秒和纳米)零,你需要使用格式 class。下面给出了一个例子:
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);
}
}
输出:
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
等]
我正在从 oracle 数据库中获取日期时间并使用 ZonedDateTime 在 java-11 中进行解析,如下所示:
甲骨文 -->
1/19/2020 06:09:46.038631 PM
java ZonedDateTime 0/p -->
2020-01-19T18:09:46.038631Z[UTC]
甲骨文 -->
1/19/2011 4:00:00.000000 AM
java ZonedDateTime o/p -->
2011-01-19T04:00Z[UTC]
(因此,默认情况下会截断 0。 但是,我的要求是像#1 一样具有一致的固定长度 o/p。)
预期java ZonedDateTime o/p --> 2011-01-19T04:00:00.000000Z[UTC]
但是,我没有找到任何日期 api 方法来实现上述预期 o/p。有什么方法可以保留固定长度的尾随 0,而不是操纵字符串。 我们在应用程序中具有一致的 ZonedDateTime 类型,因此我们不希望更改它。
We have consistent ZonedDateTime type in application, so we do not prefer to change that.
为什么您认为 2011-01-19T04:00Z[UTC]
不一致? date-time 对象应该只保存(并提供 methods/functions 操作)日期、时间和 time-zone 信息。它不应该存储任何格式信息;否则,它将违反 Single-responsibility principle. The formatting should be handled by a formating class e.g. DateTimeFormatter (for modern date-time API)、DateFormat
(旧版 java.util
date-time API)等
每个 class 都应该覆盖 toString()
函数;否则,将在打印其对象时返回 Object#toString
。 ZonedDateTime
有日期、时间和 time-zone 信息。下面给出了 time-part 的 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
时,第二和纳米部分才会包含在返回的字符串中。这意味着如果你想在输出字符串中使用这些(秒和纳米)零,你需要使用格式 class。下面给出了一个例子:
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);
}
}
输出:
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
等]