将时间设置为00:00:00

Ade*_*lin 113 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 = 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();
    }
Run Code Online (Sandbox Code Playgroud)

问题是,有时候是时间12:00:00,有时是时候00:00:00,当我查询数据库中保存的实体07.02.2013 00:00:00和存储的实际实体时间时,12:00:00查询失败.

我知道12:00:00 == 00:00:00!

我正在使用AppEngine.这是一个appengine bug,问题还是其他一些问题?或者它取决于其他东西?

rge*_*man 191

使用另一个常量代替Calendar.HOUR,使用Calendar.HOUR_OF_DAY.

calendar.set(Calendar.HOUR_OF_DAY, 0);
Run Code Online (Sandbox Code Playgroud)

Calendar.HOUR使用0-11(用于AM/PM),并Calendar.HOUR_OF_DAY使用0-23.

引用Javadocs:

public static final int HOUR

get和set的字段编号表示上午或下午的小时.小时用于12小时制(0 - 11).中午和午夜由0表示,而不是由12表示.例如,在10:04:15.250 PM,HOUR为10.

public static final int HOUR_OF_DAY

获取和设置的字段编号,表示一天中的小时.HOUR_OF_DAY用于24小时制.例如,在下午10:04:15.250,HOUR_OF_DAY是22.

测试("现在"目前是2013年7月23日太平洋夏令时时间14:55):

public class Main
{
   static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        now.set(Calendar.HOUR, 0);
        now.set(Calendar.MINUTE, 0);
        now.set(Calendar.SECOND, 0);
        System.out.println(sdf.format(now.getTime()));
        now.set(Calendar.HOUR_OF_DAY, 0);
        System.out.println(sdf.format(now.getTime()));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ javac Main.java
$ java Main
2013-07-23 12:00:00
2013-07-23 00:00:00
Run Code Online (Sandbox Code Playgroud)

  • 创建HOUR和HOUR_OF_DAY字段的人应该被鞭打并加入口粮. (11认同)
  • @JarrodRoberson但是使用`Calendar.HOUR`不会将PM设置为AM,将其保留为中午12:00. (3认同)
  • @AndroidDev 发明 am/pm 的人应该得到同样的待遇......这也适用于非公制标准 (2认同)
  • 一切都是正确的,但也应该有毫秒: now.set(Calendar.MILLISECOND, 0); (2认同)

Prz*_*mek 22

java.time

使用java.timeJava 8及更高版本中内置的框架.请参阅教程.

import java.time.LocalTime;
import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224
# start of a day
now.with(LocalTime.MIN); # 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00
Run Code Online (Sandbox Code Playgroud)

如果您不需要时间(小时,分钟,秒等),请考虑使用LocalDate课程.

LocalDate.now(); # 2015-11-19
Run Code Online (Sandbox Code Playgroud)

  • 这应该是新的公认答案,因为自从第一次提出这个问题以来 Java 1.8 已经发布了。 (2认同)

小智 11

以下是我用来做这个的几个实用函数.

/**
 * 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();
}
Run Code Online (Sandbox Code Playgroud)


tho*_*kor 8

另一种JAVA 8方式:

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);
Run Code Online (Sandbox Code Playgroud)

但是编辑已经存在的日期要有用得多。


Ben*_*Ben 6

请看下面的代码:

    String datePattern24Hrs = "yyyy-MM-dd HH:mm:ss";
    String datePattern12Hrs = "yyyy-MM-dd hh:mm:ss";

    SimpleDateFormat simpleDateFormat24Hrs = new SimpleDateFormat(datePattern24Hrs);
    SimpleDateFormat simpleDateFormat12Hrs = new SimpleDateFormat(datePattern12Hrs);

    Date dateNow = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(dateNow);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    Date dateTime = calendar.getTime();

    String dateTimeIn24Hrs = simpleDateFormat24Hrs.format(dateTime);
    String dateTimeIn12Hrs = simpleDateFormat12Hrs.format(dateTime);

    System.out.println("DateTime in 24Hrs: ".concat(dateTimeIn24Hrs));
    System.out.println("DateTime in 12Hrs: ".concat(dateTimeIn12Hrs));
Run Code Online (Sandbox Code Playgroud)

预期输出如下:

  • 24 小时内的日期时间:2021-06-29 00:00:00
  • 12 小时内的日期时间:2021-06-29 12:00:00

我希望它对您正在寻找的答案有所帮助。