当前位置: 首页 > 面试题库 >

我应该在Java 8中使用哪个日期类?

公西修文
2023-03-14
问题内容

Java 8中有一整套日期类:

  • java.time.LocalDateTime ;
  • java.time.ZonedDateTime ;
  • java.time.Instant ;
  • java.time.OffsetDateTime ;
  • java.sql.Timestamp ;
  • java.util.Date

我已经忽略了他们的JavaDocs,并注意所有这些类都包含我需要的所有方法。因此,目前,我可以随机选择它们。但是我想为什么有6个单独的类并且每个类都专用于特定目的是有原因的。

技术信息和要求:

  1. 输入为String,将转换为这些日期格式之一。
  2. 我不需要显示时区,但是当我比较两个日期时,能够正确比较纽约和巴黎的时间很重要。
  3. 精确的级别是秒,无需使用毫秒。
  4. 所需的操作:
    • 查找最大/最小日期;
    • 按日期对对象进行排序;
    • 计算日期和时间段(两个日期之间的差);
    • 将对象插入MongoDB并按日期从数据库中检索它们(例如,特定日期之后的所有对象)。

我的问题:

  1. 从性能和可维护性的角度来看,要在这四个选项中选择最佳格式,我应该牢记哪些方面?
  2. 我为什么要避免其中某些日期类?

问题答案:

每个Date类别均用于特定目的:

  • 如果要在SQL/ JDBC上下文中使用日期,请使用java.sql.Timestamp

  • java.util.Date 是旧的Java API,它不是线程安全的,您很难处理时间分区,最重要的是,它的设计不当:一种简单的统一性是,几个月从1开始,而几天从0开始。

  • java.time.LocalDateTime 是一个不变的日期时间对象,它代表一个日期时间,通常将其视为年,月,日,时,分,分,您需要确切地将其表示。

  • java.time.ZonedDateTimeclass存储所有日期和时间字段,因此您可以使用它来处理诸如: 27th January 1990 at 15:40.30.123123123 +02:00欧洲/巴黎时区中的值。

为了完成您的任务,ZonedDateTime该类将处理从本地时间线LocalDateTime到的即时时间线Instant(在时间线上对单个瞬时点进行建模)的转换。两条时间线之间的差异(由a表示)ZoneOffset是与UTC
/格林威治标准时间的偏差。

要计算持续时间和期限:有,java.time.Duration它是基于时间的时间量,例如“ 20.5秒”
java.time.Period,而是,它是基于日期的时间量(例如:26年,2个月和2天)。

要获取最大日期和最小日期,可以在以下方式中使用Java 8 lambda:

Date maxDate = list.stream().map(yourInstance -> yourInstance.date).max(Date::compareTo).get();
Date minDate = list.stream().map(yourInstance -> yourInstance.date).min(Date::compareTo).get();


 类似资料:
  • 问题内容: 在这个问题中,如何在C 11中有效地选择标准库容器?是选择C 集合时要使用的便捷流程图。 我认为对于那些不确定应该使用哪个集合的人来说,这是一个有用的资源,因此我试图找到类似的Java流程图,但未能做到。 哪些资源和“备忘单”可用来帮助人们选择使用Java进行编程时使用的正确Collection?人们如何知道应该使用哪些List,Set和Map实现? 问题答案: 由于找不到相似的流程图

  • 在这个问题中,如何在C 11中有效地选择标准库容器?是选择C集合时使用的方便流程图。 我认为对于那些不确定应该使用哪个集合的人来说,这是一个有用的资源,所以我试图找到一个类似的Java流程图,但没能做到。 有哪些资源和“备忘单”可以帮助人们在用Java编程时选择正确的集合?人们如何知道他们应该使用什么列表、集合和映射实现?

  • 问题内容: 从JavaDocs: 一的ConcurrentLinkedQueue是当许多线程共享访问一个共同的集合一个合适的选择。此队列不允许空元素。 ArrayBlockingQueue是一个经典的“有界缓冲区”,其中固定大小的数组保存由生产者插入并由消费者提取的元素。此类支持可选的公平性策略,用于订购正在等待的生产者和使用者线程 与基于阵列的队列相比,LinkedBlockingQueue通常

  • 问题内容: 的(Java持久性API)规范有2名不同的方式来指定实体组合键:和。 我在映射的实体上同时使用了这两个注释,但是对于不太熟悉的人来说,这真是一个大麻烦。 我只想采用一种指定复合键的方法。哪个真的是最好的?为什么? 问题答案: 我认为这可能更冗长,因为无法使用任何字段访问运算符来访问整个主键对象。使用,您可以这样做: 这给构成组合键的字段提供了清晰的概念,因为它们都聚集在通过字段访问运算

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我正在重写一个项目以使用Node.js。我想继续使用MySQL作为数据库(即使我不介意重写架构)。我正在寻找一种易于使用,性能合理的ORM,它支持缓存,多对一

  • 问题内容: 我在某处读到该函数将空字符串视为,因此这不是从HTML表单验证文本输入和文本框的有效方法。 因此,您可以用来检查用户是否键入了某些内容。 函数将空字符串视为是真的吗? 那我应该在什么情况下使用呢?我应该经常检查是否有东西吗? 例如代替 使用这个 问题答案: isset vs.!empty 自由贸易协定: “ isset()检查变量的值是否包含(False,0或空字符串),但不包含NUL