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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4365631/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 06:03:21  来源:igfitidea点击:

Reset time part of Calendar instance in Java

javadatetimeformatreset

提问by sergionni

There is Java code,which is ran on 2 different environments and inserts records with JdbcTemplateto DB.

有 Java 代码,它在 2 个不同的环境中运行并将记录插入JdbcTemplateDB 中

Results of its running are different for both envs. Particularly,for Datefields.

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

On first environment(Oracle XE) it produces record:

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

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

Second environment(Oracle non XE):

第二个环境(Oracle 非 XE):

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

NLS_DATE_FORMAT(if it's crucial) for first env is DD-MON-RR, for second env is DD-MON-RRRR

NLS_DATE_FORMAT(如果它很重要)对于第一个 env 是DD-MON-RR,对于第二个 env 是DD-MON-RRRR

The question is,what Oracle settings may affect,that second env Date format is another?

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

回答by sergionni

should set following Calendar properties in Java code:

应该在 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));

instead of:

代替:

  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);

回答by Kevin Lacquement

According to the documentation, HHrefers to a 12-hour time. The 12 in the time you're retrieving is 12 midnight. What you want is HH24, which ges you a 24-hour time, starting at 00 for midnight.

根据文档HH指的是 12 小时的时间。您检索时的 12 点是午夜 12 点。您想要的是HH24,它为您提供 24 小时制,从午夜 00 开始。

回答by Jon Skeet

If you don't want to show the time part, don't include a format string which includesthe time part ("HH:MI:SS").

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

You've reset the time part to midnight, basically... there's no way of differentiating between a Calendaror Dateset to exactly midnight and a Calendaror Date"without" a time part - because there's no such concept as a Calendar/Datewith only a date part.

您已将时间部分重置为午夜,基本上......没有办法区分 a Calendaror Dateset 到午夜和 a Calendaror Date“without” a time part - 因为没有这样的概念,例如 a Calendar/Date只有一个日期部分。

Now you may be able to have that in the database, depending on what types are available to you - but java.util.Dateand java.util.Calendaralways represent points in time, not just dates.

现在,你可能能够有一个数据库,这取决于什么类型的都可以给你-但java.util.Datejava.util.Calendar始终代表时间点,而不仅仅是日期。

The reason it's showing 12 instead of 00 is because you're using "HH" instead of "HH24", as per lacqui's answer. I assume you don't really wantto see the time at all though, given that you'll have reset it to midnight...

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

回答by Domenic D.

I'd recommend you extend one of the Calendar classes like this:

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

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;
    }
}

Instantiate in this way:

以这种方式实例化:

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

回答by Bhuwan Prasad Upadhyay

/*
 * 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));
    }

}