Сбросить часть времени экземпляра Calendar в Java - PullRequest
13 голосов
/ 06 декабря 2010

Существует Java-код, который запускается в 2 различных средах и вставляет записи с JdbcTemplate в DB .

Результаты его выполнения различны для обоих envs.В частности, для 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, для второго env - DD-MON-RRRR

Вопрос в том, на что могут повлиять настройки Oracle,что второй формат даты env другой?

Ответы [ 5 ]

27 голосов
/ 09 декабря 2010

должен установить следующие свойства календаря в коде 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);
4 голосов
/ 06 декабря 2010

Согласно документации , HH относится к 12-часовому времени. 12 в то время, которое вы извлекаете, это 12 часов ночи. То, что вы хотите, это HH24, что дает вам 24-часовое время, начиная с 00 для полуночи.

3 голосов
/ 06 декабря 2010

Если вы не хотите показывать временную часть, не включайте строку формата, которая включает временную часть («ЧЧ: МИ: СС»).

Вы сбросили временную часть на полночь, в основном ... нет никакого способа провести различие между Calendar или Date, установленным точно на полночь, и Calendar или Date "без" временной части - потому что нет такого понятия как Calendar / Date только с частью даты.

Теперь вы можете иметь это в базе данных, в зависимости от того, какие типы вам доступны, но java.util.Date и java.util.Calendar всегда представляют моменты времени, а не только даты.

Причина, по которой он показывает 12 вместо 00, заключается в том, что вы используете "HH" вместо "HH24", согласно ответу Лаки. Я предполагаю, что вы на самом деле не хотите, чтобы вообще видел время, учитывая, что вы сбросили его до полуночи ...

2 голосов
/ 03 мая 2012

Я бы порекомендовал вам расширить один из классов Календаря следующим образом:

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);
1 голос
/ 09 июля 2015
/*
 * 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));
    }

}
...