在 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
字段类型,而不是 TIMESTAMP
或 DATETIME
。
我在数据库中使用日期类型字段。看来,我对客户有误解。他说,不应该包括 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的情况? @user12384512getActualMinimum
可以返回 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));
【讨论】:
以上是关于在 Java 中重置日历实例的时间部分的主要内容,如果未能解决你的问题,请参考以下文章