在 Java 中重置日历实例的时间部分

Posted

技术标签:

【中文标题】在 Java 中重置日历实例的时间部分【英文标题】:Reset time part of Calendar instance in 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 字段类型,而不是 TIMESTAMPDATETIME 我在数据库中使用日期类型字段。看来,我对客户有误解。他说,不应该包括 12:00。但它不会仅通过 select 显示。当我使用 SELECT to_char(a_date, 'DD-mm-yy HH:MI:SS') 时会显示它 【参考方案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”)。

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

现在您可以在数据库中拥有它,这取决于您可以使用哪些类型 - 但java.util.Datejava.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));
    


【讨论】:

以上是关于在 Java 中重置日历实例的时间部分的主要内容,如果未能解决你的问题,请参考以下文章

如何清除/重置 jQuery UI Datepicker 日历上的选定日期?

为全日历中的外部事件重置(左上角宽度 css 样式)

将 Daterangepicker 重置为初始值

如何在java中重置URLConnection?

JQuery datePicker 日期重置

可以以编程方式重置位置和隐私设置吗?