Java 将时间设置为00:00:00

Java 将时间设置为00:00:00,java,java.util.calendar,Java,Java.util.calendar,我在Java中重置小时数时遇到问题。对于给定的日期,我想将时间设置为00:00:00 这是我的代码: /** * Resets milliseconds, seconds, minutes and hours from the provided date * * @param date * @return */ public static Date trim(Date date) { Calendar calendar =

我在Java中重置小时数时遇到问题。对于给定的日期,我想将时间设置为00:00:00

这是我的代码:

/**
     * Resets milliseconds, seconds, minutes and hours from the provided date
     *
     * @param date
     * @return
     */
    public static Date trim(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);

        return calendar.getTime();
    }
问题在于,有时时间是
12:00:00
,有时时间是
00:00
,当我查询数据库中保存在
07.02.2013 00:00
上的实体,而实际存储的实体时间是
12:00:00
时,查询失败

我知道,
12:00:00==00:00:00


我正在使用AppEngine。这是一个appengine bug、问题还是其他问题?或者它依赖于其他因素吗?

使用另一个常量而不是
日历。小时
,使用

Calendar.HOUR
使用0-11(与AM/PM一起使用),而
Calendar.HOUR OF_DAY
使用0-23

引用Javadocs:

公共静态最终整小时

用于指示get和set的字段号 上午或下午的时间。小时用于12小时 时钟(0-11)。中午和午夜由0表示,而不是由12表示。 例如,在晚上10:04:15.250,时间是10点

公共静态最终整数小时

获取和设置的字段号 表示一天中的时间。一天中的小时用于24小时 时钟。例如,在晚上10:04:15.250,一天的时间是22点

测试(“现在”是2013年7月23日太平洋夏令时14:55):

输出:

$ javac Main.java
$ java Main
2013-07-23 12:00:00
2013-07-23 00:00:00

这里有两个我用来做这件事的实用函数

/**
 * sets all the time related fields to ZERO!
 *
 * @param date
 *
 * @return Date with hours, minutes, seconds and ms set to ZERO!
 */
public static Date zeroTime( final Date date )
{
    return DateTimeUtil.setTime( date, 0, 0, 0, 0 );
}

/**
 * Set the time of the given Date
 *
 * @param date
 * @param hourOfDay
 * @param minute
 * @param second
 * @param ms
 *
 * @return new instance of java.util.Date with the time set
 */
public static Date setTime( final Date date, final int hourOfDay, final int minute, final int second, final int ms )
{
    final GregorianCalendar gc = new GregorianCalendar();
    gc.setTime( date );
    gc.set( Calendar.HOUR_OF_DAY, hourOfDay );
    gc.set( Calendar.MINUTE, minute );
    gc.set( Calendar.SECOND, second );
    gc.set( Calendar.MILLISECOND, ms );
    return gc.getTime();
}

另一种方法是使用无秒的日期格式:

public static Date trim(Date date) {
    DateFormat format = new SimpleDateFormat("dd.MM.yyyy");
    Date trimmed = null;
    try {
        trimmed = format.parse(format.format(date));
    } catch (ParseException e) {} // will never happen
    return trimmed;
}
java.time 使用内置于Java8及更高版本中的框架。看

如果你不需要一天的时间(小时,分钟,秒等),考虑使用类。< /P>


这样做可能更容易(在Java8中)

还有一种JAVA 8方式:

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);

但是编辑已经存在的日期更有用。

您最好主要将时区设置为DateFormat组件,如下所示:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
然后,通过将0毫秒传递给格式化程序,可以获得“00:00:00”时间:

String time = dateFormat.format(0);
也可以创建日期对象:

Date date = new Date(0); // also pass milliseconds
String time = dateFormat.foramt(date);
或者,您可以使用日历组件获得更多的可能性,但您也应该将时区设置为GMT以用于日历实例:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
calendar.set(Calendar.HOUR_OF_DAY, 5);
calendar.set(Calendar.MINUTE, 37);
calendar.set(Calendar.SECOND, 27);

dateFormat.format(calendar.getTime());

您可以通过以下方式执行此操作:

Calendar cal = Calendar.getInstance();
cal.set(year, month, dayOfMonth, 0, 0, 0);
Date date = cal.getTime();

我们可以使用java 8/Joda datetime api的LocalDate类将java.util.Date时间部分设置为00:00:00

Date datewithTime = new Date() ; // ex: Sat Apr 21 01:30:44 IST 2018
LocalDate localDate = LocalDate.fromDateFields(datewithTime);
Date datewithoutTime = localDate.toDate(); // Sat Apr 21 00:00:00 IST 2018

如果需要字符串格式00:00:00,应使用SimpleDataFormat,如下所示。用“H”代替“H”


由于Java8添加了新的日期函数,我们可以很容易地做到这一点


//如果您有instant,则:
Instant instant1=Instant.now();
Instant day1=instant1.truncatedTo(ChronoUnit.DAYS);
系统输出打印项次(第1天)//2019-01-14T00:00:00Z
//如果您有日期,则:
日期=新日期();
Instant instant2=date.toInstant();
Instant day2=instant2.truncatedTo(ChronoUnit.DAYS);
系统输出打印项次(第2天)//2019-01-14T00:00:00Z
//如果您有LocalDateTime,则:
LocalDateTime dateTime=LocalDateTime.now();
LocalDateTime day3=dateTime.truncatedTo(ChronoUnit.DAYS);
系统输出打印项次(第3天)//2019-01-14T00:00
字符串格式=day3.format(DateTimeFormatter.ISO\u LOCAL\u DATE\u TIME);
System.out.println(格式)//2019-01-14T00:00:00
tl;博士 java.time 您正在使用可怕的旧日期时间类,这些类在几年前被JSR310中定义的现代java.time类所取代

日期
➙ <代码>即时 A
java.util.Date
表示UTC中的一个时刻。它的替代品是即时的。调用添加到旧类中的新转换方法

Instant instant = myJavaUtilDate.toInstant() ;
时区 指定希望一天中的新时间有意义的时区

大陆/地区
的格式指定,例如
美国/蒙特利尔
非洲/卡萨布兰卡
,或
太平洋/奥克兰
。切勿使用2-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

ZoneDateTime
ZoneId
应用于
Instant
以获取
zoneDateTime
。同一时刻,时间线上的同一点,但不同的挂钟时间

ZonedDateTime zdt = instant.atZone( z ) ;
改变一天中的时间 你要求改变一天的时间。应用
LocalTime
更改一天中的所有时间部分:小时、分钟、秒、分数秒。将实例化一个新的
ZoneDateTime
,其值基于原始值。time类使用此模式来提供

一天中的第一刻 但你明确要求的是00:00。所以很明显你想要一天中的第一刻。注意:某些区域的某些天不是从00:00:00开始的。由于夏时制(DST)等异常情况,它们可能会在其他时间(如01:00:00)启动

让java.time确定第一个时刻。提取仅日期部分。然后通过时区获得第一个时刻

LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
调整到UTC 如果需要返回UTC,请提取一个
即时

Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ <代码>日期 如果需要
java.util.Date
与尚未更新为java.time的旧代码进行互操作,请转换

java.util.Date d = java.util.Date.from( instant ) ;
另一个简单的方法

final Calendar today = Calendar.getInstance();
        today.setTime(new Date());
        today.clear(Calendar.HOUR_OF_DAY);
        today.clear(Calendar.HOUR);
        today.clear(Calendar.MINUTE);
        today.clear(Calendar.SECOND);
        today.clear(Calendar.MILLISECOND);
在Java 8之前:

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Java 8之后:

LocalDateTime.now().with(LocalTime.of(0, 0, 0))

这可能与不同的地区有关,还是总是发生在同一台PC上?当我在appengine上部署时,就会发生这种情况。许多其他缩短时间的解决方案:仅供参考,麻烦的旧日期时间类,如,和
java.text.simpleDataFormat
,现在,被内置在Java8和Java9中的类所取代。请参阅。我使用了
calendar.set(calendar.HOUR\u OF_DAY,0),就我而言,它工作得很好。@JarrodRoberson但使用
Calendar.HOUR
不会将PM设置为AM,将其保留为中午12:00。创建“HOUR”和“HOUR OF_DAY”字段的任何人都应该被鞭打和p
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
LocalTime lt = LocalTime.of( 15 , 30 ) ;  // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ; 
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Instant instant = zdtFirstMomentOfDay.toInstant() ;
java.util.Date d = java.util.Date.from( instant ) ;
final Calendar today = Calendar.getInstance();
        today.setTime(new Date());
        today.clear(Calendar.HOUR_OF_DAY);
        today.clear(Calendar.HOUR);
        today.clear(Calendar.MINUTE);
        today.clear(Calendar.SECOND);
        today.clear(Calendar.MILLISECOND);
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
LocalDateTime.now().with(LocalTime.of(0, 0, 0))