【问题标题】:how to get today's date and add 7 days to it and the insert into oracle sql?如何获取今天的日期并将其添加 7 天并插入到 oracle sql 中?
【发布时间】:2023-04-03 23:17:01
【问题描述】:

我正在开发一个程序,我想在 servlet 中检索今天的日期,然后在其中添加一些天,比如 7 天,然后最后插入到 oracle SQL 数据库中。

我正在使用准备好的语句来进行调用。到目前为止,我使用以下代码获得了当前日期。

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
Date date = new Date();

如何添加 7 天,然后将其插入数据库?

【问题讨论】:

  • 你为什么要使用DateFormat?仅当您想处理文本时才需要这样做,而且看起来您不需要任何文本。现在,您所说的“7 天”到底是什么意思?你的意思是“7 x 24 小时的经过时间”吗?还是您的意思是“同一时间,7 天后”?假设您正在考虑时区,这些是围绕 DST 转换的不同内容。如果您对使用 UTC 感到满意,那就更简单了……
  • 基本上我要做的是,获取当前系统日期并添加 7 天。例如今天的日期 01-05-2015 并将其设置为 08-05-2015 然后插入D b。我正在使用日期格式来实现这一点,不确定它是否正确。有什么帮助吗?
  • 不,这不是正确的方法,因为您根本不应该为此使用 text。所以你只需要日期部分,而不是日期/时间 - 很抱歉之前没有注意到它。现在,您对哪个时区感兴趣?现在对我来说是 5 月 1 日,但对我在加利福尼亚的同事来说是 4 月 30 日......
  • 哦,您使用的是哪个版本的 Java?

标签: java date jdbc


【解决方案1】:

java.time

现代方法是使用 java.time 类。问题和其他答案使用麻烦的旧旧日期时间类。

LocalDate

LocalDate 类表示没有时间和时区的仅日期值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

简单的日期数学。

LocalDate weekLater = today.plusWeeks( 1 );

数据库

如果您有兼容 JDBC 4.2 或更高版本的数据库驱动程序,您应该能够使用 PreparedStatement::setObject 方法通过 JDBC 传递 LocalDate 对象。

myPreparedStatement.setObject( … , weekLater );

如果不是,您必须转换为旧的 java.sql.Date 类。

java.sql.Date sqlDate = java.sql.Date.valueOf( weekLater );
myPreparedStatement.setDate( … , sqlDate );

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到 java.time。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

    使用java.util.Calendar 类获取天数(取决于您的要求)添加所需的天数 天可以Day in month or day in week or day in year我觉得对于你的要求days in month比较好...

    java.util.Date date = new Date();
    Calendar cal = Calendar.getInstance();
    //date = cal.getTime();
    
    int days = cal.get(Calendar.DAY_OF_MONTH);
    cal.set(Calendar.DAY_OF_MONTH, days+7);
    date = cal.getTime();
    System.out.println(date);
    

    【讨论】:

    • 能否请您edit 解释一下为什么这段代码回答了这个问题?纯代码答案是 discouraged,因为它们不教授解决方案。
    【解决方案3】:

    您可以让数据库为您计算并执行以下操作:

    PreparedStatement ps = null;
    try {
        String sql = "INSERT INTO mytable (id, datecolumn) VALUES (?, trunc(?) + 7)";
        ps = myConnection.prepareStatement(sql);
        ps.setString(1, id);
        ps.setDate(2, new Date());
        // if your DB has a different timezone than your app server,
        // you should use this instead
        // ps.setDate(2, new Date(), Calendar.getInstance("<TZ of DB>"));
        ps.executeUpdate();
    } finally {
        if (ps != null) {
            ps.close();
        }
    }
    

    此代码将日期值插入目标列,其中时间部分设置为零(使用 Oracle 的 trunc function),并且日期增加 7 天。

    请务必注意,如果数据库的时区与 JVM 不同,则应使用考虑 TZ 的setDate 重载。

    【讨论】:

      【解决方案4】:

      假设添加 7 天,以下代码 sn-p 将起作用:

            Calendar cal = Calendar.getInstance();
           //in below line of code, date is in which which you want to add 7 number of days
              cal.setTime(date);
              cal.add(Calendar.DATE, 7);
              java.util.Date utilDate = cal.getTime();
              java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
      

      现在您可以在插入查询中使用 sqlDate 值。

      希望对你有帮助:)

      【讨论】:

        【解决方案5】:

        根据您的日期格式dd/MM/yyyy,我假设您只对日期感兴趣而不是日期时间(时间戳,如 dd/MM/yyyy hh:mm:ss),您可以轻松地在Java 8 与 java.time 包中的新日期时间 API 类似

        LocalDate date = LocalDate.now();
        date = date.plusDays(7);
        

        在您的 PreparedStatement 中,您可以像这样使用 setObject

        PreparedStatement ps = Connection.prepareStatement(sql);
        ps.setObject(2,date); // 2 is the place holder for your date column
        

        请注意,这些新类和 String 一样是不可变的,因此对它们的任何更改都会返回一个新对象,并且您需要在调用任何方法后捕获返回值。

        有关更多信息,请查看 API here

        【讨论】:

        • 我认为这对我有用。让我检查一次。
        • 请注意,这将为您提供 JVM 实例运行的本地日期,如果您认为您的应用程序将在一个位置运行而您的用户可以访问,则需要考虑 JonSkeet 关于考虑时区的建议它从任何位置
        • 需要考虑的重要一点是 JVM 和数据库之间的 TZ 差异;详情见我的回答。
        • 是的,我考虑过,但我正在处理的项目将在我的系统上本地运行。其他地方没有部署,所以本地时间对我有好处。
        • 我正在使用的 Eclipse 中的 j2ee 版本没有显示 localdate 类。有什么线索吗?
        【解决方案6】:
               Calendar cal = Calendar.getInstance();
              cal.clear(Calendar.HOUR_OF_DAY);
              cal.clear(Calendar.AM_PM);
              cal.clear(Calendar.MINUTE);
              cal.clear(Calendar.SECOND);
              cal.clear(Calendar.MILLISECOND);
            int days = 7;
            // Add days
            calendar.add(Calendar.DAY_OF_MONTH, days);
            System.out.println(calendar.getTime());    
        

        【讨论】:

          【解决方案7】:

          获取日历实例,调用setTime,调用add,调用getTime

          https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#setTime%28java.util.Date%29

          https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#add%28int,%20int%29

          将日期交替添加到您准备好的语句中...参见 This SO question 作为示例

          【讨论】:

            猜你喜欢
            • 2019-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-18
            • 1970-01-01
            • 1970-01-01
            • 2011-12-03
            相关资源
            最近更新 更多