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

日期vs时间戳vs日历?

翁硕
2023-03-14
问题内容

有时,我会对Java中不同的Date类型及其实际用法感到困惑。在这里我想总结一下我的理解

java.sql.Date :- 毫秒值左右的精简包装,可让JDBC将其标识为SQL DATE值

java.sql.Timestamp :-围绕java.util.Date的瘦包装器,该包装器允许JDBC API将其标识为SQL
TIMESTAMP值。通过允许小数秒的精度达到纳秒级,它增加了保存SQL TIMESTAMP小数秒值的能力。

我已经看到大多数项目都更喜欢时间戳而不是日期。我认为这样做的主要原因是,Timestamp可以将值保留到纳秒精度,而Data可以保留到毫秒。正确?

Calendar :-
此类设计用于日期操作,例如:-用于在特定时间点和一组日历字段(例如YEAR,MONTH,DAY_OF_MONTH,HOUR等)之间进行转换,以及用于处理日历字段,例如获取下周的日期。尽管我不知道为什么只有一个实现(即GregorianCalendar)时此类是抽象的。


问题答案:

java.sql.Timestamp 一个很薄的包装器,java.util.Date它使JDBC API可以将其标识为SQL
TIMESTAMP值。

如果检查java.sql.TimestampJavaDoc,则很明显该类是
从扩展
java.util.Datejava.sql.Date确实如此)。在现实世界的项目中,java.util.Date在将数据存储到数据库中时,您必须java.sql.Timestamp做到简单,主要是因为它存储日期和时间值,而java.sql.Date仅存储日期值。

另一方面,java.util.Calendar抽象的,因为除了之外还有更多实现java.util.GregorianCalendar。如果你看到的代码Calendar#getInstance从热点,你会看到,它调用createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT))了,这种方法的代码使用3个不同的日历:BuddhistCalendarJapaneseImperialCalendarGregorianCalendar。此代码是从JDK
7源代码复制的:

private static Calendar createCalendar(TimeZone zone,
                                       Locale aLocale) {
    Calendar cal = null;

    String caltype = aLocale.getUnicodeLocaleType("ca");
    if (caltype == null) {
        // Calendar type is not specified.
        // If the specified locale is a Thai locale,
        // returns a BuddhistCalendar instance.
        if ("th".equals(aLocale.getLanguage())
                && ("TH".equals(aLocale.getCountry()))) {
            cal = new BuddhistCalendar(zone, aLocale);
        } else {
            cal = new GregorianCalendar(zone, aLocale);
        }
    } else if (caltype.equals("japanese")) {
        cal = new JapaneseImperialCalendar(zone, aLocale);
    } else if (caltype.equals("buddhist")) {
        cal = new BuddhistCalendar(zone, aLocale);
    } else {
        // Unsupported calendar type.
        // Use Gregorian calendar as a fallback.
        cal = new GregorianCalendar(zone, aLocale);
    }

    return cal;
}

现在,为什么直接使用Calendar而不是GregorianCalendar?因为提供时必须使用抽象类和接口,而不是直接使用实现。这在这里有更好的解释:“编程到接口”是什么意思?

除此之外,如果您要处理日期和时间,我建议使用类似Joda-Time的库,该库已经可以处理和解决当前Java Date
API的许多问题,并且还提供了以java.util.Date风味方式检索此日期和时间对象的方法。。



 类似资料:
  • 我知道这是一个非常常见的问题,但我觉得我找到的答案并没有真正解决问题。我将概述我的具体用例,并对来自其他SO答案和网络的信息进行总结。 对于我正在编写的服务,数据库条目被创建并存储在移动设备和我们的网站上,需要以两种方式同步。我们目前的目标是Android和iOS,它们都使用sqlite作为关系数据库。服务器端是使用Django和MySQL在Python中实现的,但将来可能会有其他解决方案取代它。

  • 我正在为我的聊天应用程序使用firebase。在聊天对象中,我使用方法添加时间戳。 请就这个问题提出解决办法

  • 问题内容: 我有一个数据库,它将具有标准sql格式的UMT时间戳。如何提取数据并为其设置Java日期对象? 据我所知mysql是 至于Java,日期/时间的东西一直躲着我。 如果有人为此知道一个好的图书馆,我欢迎您提出建议。 问题答案: 为什么不直接阅读为 看到

  • 何时何地哪个更可取? 我不知道他们之间到底有什么区别。 来自LocalDateTime的文档 ...时间表示为纳秒精度。例如,值“2007 年 10 月 2 日 13:45.30.123456789”可以存储在 LocalDateTime 中。 我假设LocalDateTime也可以接受纳秒。所以我想,我可以用LocalDateTime替换我的代码,它们被声明为TimeStamp。如果我错了,请纠

  • 问题内容: 我需要将unix时间戳转换为日期对象。 我尝试了这个: 时间戳值为: 日期应该是“ 2019/07/30-22:30:00”(因为我是通过PHP获取的),但我却得到了。 应该怎么做? 问题答案: 对于,请乘以1000,因为java期望的是毫秒: 如果你已经有毫秒,那么 ;

  • 问题内容: 这是我要传递时间戳的Under函数,我只需要从时间戳返回的日期,而不是小时和秒。通过以下代码,我得到了- 这是我得到的输出。 但是我只需要这样的日期 有什么建议? 问题答案: 改用SimpleDateFormat: 更新 :Java 8解决方案: