数据库DateTime milli&;在java-11中使用ZoneDateTime时,如果nano秒为0,则默认情况下会截断nano秒
我正在从oracle db获取datetime,并使用ZonedDateTime在java-11中进行解析,如下所示:数据库DateTime milli&;在java-11中使用ZoneDateTime时,如果nano秒为0,则默认情况下会截断nano秒,datetime,java-8,zoneddatetime,datetimeformatter,Datetime,Java 8,Zoneddatetime,Datetimeformatter,我正在从oracle db获取datetime,并使用ZonedDateTime在java-11中进行解析,如下所示: 甲骨文-->1/19/2020 06:09:46.038631 PM java ZoneDateTime 0/p-->2020-01-19T18:09:46.038631Z[UTC] oracle-->2011年1月19日上午4:00:00.000000 java ZoneDateTime o/p-->2011-01-19T04:00Z[UTC](因此,这里的0在默认情况下被
1/19/2020 06:09:46.038631 PM
java ZoneDateTime 0/p-->2020-01-19T18:09:46.038631Z[UTC]
2011年1月19日上午4:00:00.000000
java ZoneDateTime o/p-->2011-01-19T04:00Z[UTC]
(因此,这里的0在默认情况下被截断。
但是,我的要求是具有一致的固定长度o/p,如#1。)
2011-01-19T04:00:00.000000 z[UTC]
然而,我没有找到任何日期api方法来实现上述预期的o/p。除了操纵字符串,还有什么方法可以用固定长度保留尾随的0。
我们在应用程序中有一致的ZonedDateTime类型,所以我们不希望更改它
我们在应用程序中有一致的ZonedDateTime类型,因此我们没有
我更愿意改变这一点
为什么您认为2011-01-19T04:00Z[UTC]
不一致?日期时间对象应该只保存(并提供操作方法/函数)日期、时间和时区信息。它不应该存储任何格式信息;否则,它将违反法律。格式化应该由格式化类处理,例如DateTimeFormatter(),DateFormat
(对于旧式java.util
date-time API)等
每个类都应该重写toString()
函数;否则,打印对象时将返回Object#toString
。ZoneDateTime
包含日期、时间和时区信息。下面给出了时间部分的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();
}
输出:
2011-01-19T04:00Z
2011-01-19T04:00:00.000000Z
值得思考的是:
您希望从上面给出的代码中得到什么输出?
5.0
是否表示与5.0000
不同的值?您将如何打印5.0000
?[提示:检查String#format
,NumberFormat
,BigDecimal
等]如何打印?使用System.out::println
?您应该使用格式化程序输出ZoneDateTime
的格式化输出。我想用所需的格式将其写入文件format@deval.techie-写入字符串输出的值
,如中所示,输入文件。只需使用DateTimeFormatter
指定所需的小数位数。两个可能相关的问题,以及。非常感谢Arvind。我不知道确切的模式。它工作正常。实际上,“uuu-MM-dd'HH:MM:ss.nnnnnn-nz”导致了长度问题。例如,对于0,它在o/p中为nanos提供了完美的6位数字,但对于在源日期具有6位数字的非零,它通过添加30为nanos提供了9位输出。因此,我几乎没有修改模式,它为我的预期输出提供了一致的结果:“uuu-MM-dd'T'HH:MM:ss.SSSSSS'Z['Z']”。生成的字符串o/p:“2020-04-14T15:51:58.109932Z[UTC]”
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);
}
}