数据库DateTime毫秒和纳秒如果为0则默认被截断,而在Java 11中使用ZonedDateTime时使用它

2024-02-13

我正在从 Oracle 数据库中获取日期时间并进行解析Java 11 https://en.wikipedia.org/wiki/Java_version_history#Java_11使用 ZonedDateTime 如下:

  1. 甲骨文 -->1/19/2020 06:09:46.038631 PM

    Java 分区日期时间 https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html输出-->2020-01-19T18:09:46.038631Z[UTC]

  2. 甲骨文 -->1/19/2011 4:00:00.000000 AM

    Java 分区日期时间输出-->2011-01-19T04:00Z[UTC](因此,这里的 0 默认被截断。 但是,我的要求是具有一致的固定长度输出,如#1。)

预期的 Java ZonedDateTime 输出 -->2011-01-19T04:00:00.000000Z[UTC]

但是,我没有找到任何日期 API 方法来实现上述预期输出。有没有办法保留固定长度的尾随 0,而不是操作字符串?

我们在应用程序中具有一致的 ZonedDateTime 类型,因此我们不想更改它。


我们在应用程序中具有一致的 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.]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库DateTime毫秒和纳秒如果为0则默认被截断,而在Java 11中使用ZonedDateTime时使用它 的相关文章

随机推荐

  • 如何在 vue-cli 中禁用 ESLint?

    我该如何禁用ESlint在生成的项目中vue cli preLoaders test vue loader eslint include projectRoot exclude node modules test js loader esl
  • Google Sheets 查询图像从查询结果中显示

    当图像从查询中出来时 我不知道如何在 gsheet 的单元格中显示图像 我尝试过各种形式的数组公式和查询组合 但没有任何结果 希望有任何帮助 尝试过这个 A4 A21 是图像 URL ARRAYFORMULA 查询 B4 B21 图像 A4
  • Objective-C 中的美元符号是什么意思?

    CAGradientLayer grad CAGradientLayer layer grad colors array ColRGBA2 1 0 0 1 ColRGBA2 0 1 0 1 ColRGBA2 0 0 1 1 ColRGBA2
  • 如何让 axios 使用 AWS ACM 公共证书?

    我很惊讶地发现 在使用 axios 和 node fetch 时 AWS ACM 颁发的公共证书会触发 无法验证第一个证书 错误 但是 当我从命令行使用curl 时 我没有收到错误 所以我的问题是 为什么节点会有这样的行为 Curl 似乎可
  • 对小文本进行有效搜索

    我有许多小文本 假设大约 500 个单词 和两个数据库 每个数据库大约有 10 000 个条目 关键字 我现在想要处理每个文本并找出文本中包含哪些关键字 保存在两个数据库中的关键字 你们中有人有关于如何有效地做到这一点的好方法吗 我想在搜索
  • 使用正则表达式的缺点

    最近 我的经理建议我不要过度依赖正则表达式 因为它有很多缺点 当我尝试了解更多信息时 我听说它存在诸如正则表达式之类的问题 因为某些对象即使在使用后仍会继续挂在字符串引用上 从而导致内存泄漏 NET RegEx 内存泄漏 调查 https
  • NgRx 和 localStorage 的组合

    我对 NGRX 和状态管理的概念有点陌生 因为我来自后端开发 每当我看到和听到状态管理这个术语时 我脑海中浮现的就是 CQRS 嗯 互联网上的一些文章说它是以此为模式的 我的问题是 在我的角度应用程序中 我可以做类似的事情 从后端获取数据然
  • 减少频繁重新部署(上传)到远程服务器的战争规模

    在开发过程中 我需要经常更新我的 Web 应用程序源代码并将更新后的 war 部署到远程 Tomcat 服务器 在我的连接上上传大型战争 25MB 需要太长时间 大约 30 分钟 效率非常低 有什么办法可以减少战争规模吗 我的项目中有很多外
  • CSS:浮动时忽略div高度

    I m trying to display some pictures All of them have the same width but different height I m trying to do something like
  • 在不同 Perl 版本下运行的程序之间传递对象

    使用从 perl5 6 pl 到 perl5 24 pl 的不同 perl 版本将对象作为输入参数传递时遇到问题 无法从函数 from 5 24 获取返回值 下面提供了有问题的代码 使用windows平台 如何解决这个问题 SharedBe
  • 从 .un~ 文件恢复 vim 文件,无需撤消命令

    如何从 vim 文件恢复undo不点击文件undo 我有一个在添加文本时保存的 vim 文件 然后我运行了一个 python 命令来清空文件的内容 我可以看到文件中包含的一些单词 un 文件 当我尝试在文件中撤消时 它说Already at
  • Java HttpURLConnection 使用 SOCKS 代理而不是 HTTP

    我有一个非常简单的代码 使用 HttpURLConnection 通过代理访问某个网站 System setProperty java net useSystemProxies true System out println Proxy P
  • 如何对项目中的单个文件禁用 ARC?

    我在我的项目中成功使用了 ARC 然而 我遇到了一些文件 例如 在单元测试和模拟对象中 其中 ARC 的规则现在有点脆弱 我记得听说有一种方法可以在每个文件的基础上禁用 ARC 尽管我一直找不到这个选项 这可能吗 如何针对每个文件禁用 AR
  • 下面代码的时间复杂度是多少?

    sum 0 for int i 1 i
  • WPF TextBlock 红色负数

    我试图找出创建样式 触发器以将前景设置为红色 当值 如果您没有使用 MVVM 模型 您可能有 ForegroundColor 属性 那么最简单的方法就是创建一个新的 IValueConverter 将您的背景绑定到您的值 在 MyWindo
  • 使用 Docker Desktop 的 WSL2 上的 Docker 卷

    我刚刚在 Windows 上使用 Docker 尝试 WSL 2 但在安装卷时遇到了问题 version 3 7 services node build container name node hostname node volumes a
  • 如何使用Qt获取wifi信号强度?

    到目前为止 我可以使用 QNetworkConfigurationManager allConfigurations 扫描所有可用的 wifi 但是每个的 QNetworkConfiguration 数据都没有 wifi 信号强度 你能告诉
  • Swift 类/结构隐式符合 NSObjectProtocol?

    不久前我遇到了奇怪的 Swift 问题 当我尝试在调试中将 Swift 对象转换为 NSObjectProtocol 时 它执行成功 但是当这段代码在 AppStore 构建中执行时 它会转换为 nil import Foundation
  • 使用c++禁用任务切换键

    我已经做了很多搜索 但没有真正的解决方案 针对我自己的问题 所以我想我会在这里问 我正在设计一个类似信息亭的程序 防止用户在程序运行时使用任务键 alt tab alt esc ctrl esc 等 请注意 我是一名新手程序员 因此如果可以
  • 数据库DateTime毫秒和纳秒如果为0则默认被截断,而在Java 11中使用ZonedDateTime时使用它

    我正在从 Oracle 数据库中获取日期时间并进行解析Java 11 https en wikipedia org wiki Java version history Java 11使用 ZonedDateTime 如下 甲骨文 gt 1