Java日期计算

时间:2012-02-27 04:19:59

标签: java date

我有一个数据库字段,其中日期存储为DD / MM / YYYY格式。现在我要做的是看今天date =存储日期 - 1.基本上如果今天是结束日期的前一天。基于此,我将采取一些行动......

格式示例:

10/02/2012

这里有格式化问题,因为我使用了这个:

Date todayDate;

存储日期在DB中为VARCHAR2。我假设我必须将检索的日期转换为日期常规格式,或类似的东西。帮助将不胜感激。

更新

                currentEndDate =  rset.getString("ENDDATE");
                endDate = (Date)formatter.parse(currentEndDate);
                /*Check if end date = today date - 1*/
                Calendar cal = Calendar.getInstance();
                //set to end date
                cal.setTime(endDate);
                //end date - 1
                cal.add(Calendar.DATE, -1); 
                Date today;

现在这就是我所拥有的......我正在尝试获取结束日期-1所以我使用add()函数做到了。现在如何检查结束日期 - 1 ==今天的日期?因为我试过的时候:

if(today.equals(cal.add(Calendar.date, -1)))

它表示从add函数返回void。 谢谢,

3 个答案:

答案 0 :(得分:3)

有三种与时间相关的JDBC类型:

  1. JDBC DATE 类型表示由日,月和年组成的日期。相应的SQL DATE类型在SQL-92中定义,但它仅由主要数据库的子集实现。有些数据库提供了支持类似语义的替代SQL类型。
  2. JDBC TIME 类型表示由小时,分钟和秒组成的时间。相应的SQL TIME类型在SQL-92中定义,但它仅由主要数据库的子集实现。与DATE一样,某些数据库提供支持类似语义的备用SQL类型。
  3. JDBC TIMESTAMP 类型表示DATE加上TIME加上纳秒字段。相应的SQL TIMESTAMP类型在SQL-92中定义,但它仅由极少数数据库实现。
  4. 因为标准Java类java.util.Date与这三种JDBC日期/时间类型中的任何一种都不完全匹配(它包括DATE和TIME信息但没有纳秒),JDBC定义了java.util.Date的三个子类对应于SQL类型。他们是:

    1. java.sql.Date表示SQL DATE信息。 java.util.Date基类的小时,分​​钟,秒和毫秒字段应设置为零。如果提供给java.sql.Date构造函数的毫秒数为负数,则驱动程序将计算日期作为1970年1月1日之前的毫秒数。否则,日期将计算为1月1日后指定的毫秒数, 1970。
    2. java.sql.Time获取SQL TIME信息。 java.util.Date基类的年,月和日字段设置为1970年,1月和1。这是Java纪元中的“零”日期。
    3. java.sql.Timestamp获取SQL TIMESTAMP信息。此类通过添加纳秒字段来扩展java.util.Date。
    4. 所有三个与JDBC时间相关的类都是java.util.Date的子类,因此,它们可以在需要java.util.Date的地方使用。例如,国际化方法将java.util.Date对象作为参数,因此可以传递任何与JDBC时间相关的类的实例。

      JDBC Timestamp对象具有其父级的日期和时间组件以及单独的纳秒组件。如果在期望java.sql.Timestamp对象的地方使用java.util.Date对象,则纳秒组件将丢失。

      但是,由于java.util.Date对象的存储精度为1毫秒,因此在将java.sql.Timestamp对象转换为java.util.Date对象时可以保持这种精度。这是通过将纳秒组件中的纳秒转换为整秒(通过将纳秒数除以1,000,000)然后将结果添加到java.util.Date对象来完成的。此转换中最多可能会丢失999,999纳秒,但生成的java.util.Date对象将精确到1毫秒内。

      以下代码片段是将java.sql.Timestamp对象转换为精确到1毫秒内的java.util.Date对象的示例。

      Timestamp t = new Timestamp(98724573287540L);
      java.util.Date d;
      d = new java.util.Date(t.getTime() + (t.getNanos() / 1000000));
      

答案 1 :(得分:1)

您可以在数据库中直接使用Date类型,您可以直接将其作为Date实例在java中

答案 2 :(得分:1)

您需要将String转换为日期。您可以在查询中或在获得字符串结果后执行此操作:

选项1:在查询中将其变为日期类型:

SELECT TO_DATE("COLNAME", 'MM/DD/YYYY') FROM "MYTABLE"

选项2:获取字符串后将其转换为日期类型:

String date_from_db;
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date date = sdf.parse(date_from_db);

然后您可以查看当前时间(new Date())是否在检索日期和之前一天之间。如果你想要处理包括闰秒在内的所有极端情况,你将不得不使用Calendar,但是如果你没有留下闰秒那么就可以减去24 * 60 * 60 *距离数据库日期1000毫秒。

根据API documentation,您无法直接比较DateCalendar

  当且仅当getTime方法为两个

返回相同的long值时,

...对象才相等

此外,Calendar的{​​{3}}无效:

  

当且仅当参数是表示相同时间值的同一日历系统的Calendar对象时,结果才为真

简单解决方案:使用Calendar的{​​{1}}方法,该方法返回getTime()对象,可以使用Dateequals()轻松与其他日期进行比较,和after()

或代码:

before()

您还可以实例化另一个cal.add(Calendar.DAY, -1); if(cal.getTime().equals(new Date())) { ... } 并使用其Calendar,但这似乎效率较低。