数据库DateTime milli&;在java-11中使用ZoneDateTime时,如果nano秒为0,则默认情况下会截断nano秒

数据库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在默认情况下被

我正在从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在默认情况下被截断。 但是,我的要求是具有一致的固定长度o/p,如#1。)

  • 预期java ZoneDateTime o/p-->
    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);
        }
    }