【问题标题】:Reset time part of Calendar instance in Java在 Java 中重置日历实例的时间部分
【发布时间】:2011-05-20 22:05:26
【问题描述】:

有 Java 代码,在 2 个不同的环境中运行,并将带有JdbcTemplate 的记录插入到DB。

两个环境的运行结果不同。特别是对于Date 字段。

在第一个环境(Oracle XE)上它产生记录:

"12/03/2010";191094;"71697211000";3229;880323202;NULL;0;1;0;NULL;0;NULL

第二种环境(Oracle非XE):

"12/03/2010 12:00:00";191094;"71697211000";3229;880323202;NULL;0;1;0;NULL;0;NULL

NLS_DATE_FORMAT(如果很重要的话)第一个 env 是 DD-MON-RR, 第二个环境是DD-MON-RRRR

问题是,Oracle 设置可能会影响什么,第二个 env 日期格式是另一种格式?

【问题讨论】:

  • 只是不要在数据库中存储/检索时间部分。使用 DATE 字段类型,而不是 TIMESTAMP 或 DATETIME。
  • 我在数据库中使用日期类型字段。看来,我对客户有误解。他说,不应该包括 12:00。但它不会仅通过 select 显示。当我使用 SELECT to_char(a_date, 'DD-mm-yy HH:MI:SS') 时会显示它

标签: java date time format reset


【解决方案1】:

应在 Java 代码中设置以下日历属性:

  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
  cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE));
  cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND));
  cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND));

代替:

  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.HOUR_OF_DAY, 0);
  cal.set(Calendar.MINUTE, 0);
  cal.set(Calendar.SECOND, 0);
  cal.set(Calendar.MILLISECOND, 0);

【讨论】:

  • 有没有可以返回不为0的情况?
  • @user12384512 getActualMinimum 可以返回 0 以外的值,但不能返回上面列出的字段。
【解决方案2】:

根据the documentation,HH指的是12小时的时间。您检索的时间中的 12 点是午夜 12 点。你想要的是HH24,它给你一个24小时的时间,从00开始到午夜。

【讨论】:

    【解决方案3】:

    如果您不想显示时间部分,请不要包含包含时间部分的格式字符串(“HH:MI:SS”)。

    您已将时间部分重置为午夜,基本上...没有办法区分设置为午夜的 Calendar 或 Date 与“没有”时间部分的 Calendar 或 Date - 因为没有像 Calendar/Date 这样的概念,只有日期部分。

    现在您可以在数据库中拥有它,这取决于您可以使用哪些类型 - 但java.util.Date 和 java.util.Calendar 始终代表时间点,而不仅仅是日期。

    根据 lacqui 的回答,它显示 12 而不是 00 的原因是因为您使用的是“HH”而不是“HH24”。不过,我假设您根本不会想要查看时间,因为您会将其重置为午夜...

    【讨论】:

    • 乔恩,所以无论如何 12:00:00 在我的情况下是否意味着时间部分已重置?
    • @sergionni:是的,这表明您已将其设置为午夜。如果您将 c.set 调用更改为使用不同的值,您也会在格式化版本中看到相应的值。
    • @Jon:我刚刚从这个表中得到了真正的初始化脚本,这个字段看起来像:a_date DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (a_date="NULL")。
    • @serionni:我们不知道你想要达到什么目标,所以很难说。
    • @Jon: 抱歉,是SQL loader内容,初始化脚本没问题,请看,更新我的帖子
    【解决方案4】:

    我建议您像这样扩展日历类之一:

    public class CalendarDateOnly extends GregorianCalendar {
    
        public static Calendar getInstance() {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
            cal.set(Calendar.MINUTE,      cal.getActualMinimum(Calendar.MINUTE));
            cal.set(Calendar.SECOND,      cal.getActualMinimum(Calendar.SECOND));
            cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND));
            return cal;
        }
    }
    

    以这种方式实例化:

    Calendar june30 = CalendarDateOnly.getInstance();
    june30.set(2000, Calendar.JUNE, 30);
    

    【讨论】:

    • extends GregorianCalendar 似乎什么也没做
    【解决方案5】:
    /*
     * Date : 2015-07-09
     * Author : Bhuwan Prasad Upadhyay
     */
    package com.developerbhuwan.date.utils;
    
    import java.util.Calendar;
    import java.util.Date;
    
    /**
     *
     * @author developerbhuwan
     */
    public class CalenderUtils {
    
        public static Calendar getNewCalendarInstance() {
            Calendar calendar = Calendar.getInstance();
            return resetCalender(calendar);
        }
    
        public static Date resetDate(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            return resetCalender(calendar).getTime();
        }
    
        public static Calendar resetCalender(Calendar calendar) {
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar;
        }
    
        public static void setTimeInCalendar(Calendar calendar, Date date) {
            calendar.setTime(resetDate(date));
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 2017-12-29
      • 2010-09-29
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多