设置时间为00:00:00

我有一个问题重置小时在 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:00,当我查询数据库中保存在 07.02.2013 00:00:00上的实体时,实际存储的实体时间是 12:00:00,查询失败。

我知道那个 12:00:00 == 00:00:00

我正在使用 AppEngine。这是一个应用引擎错误,问题或其他问题?还是取决于其他因素?

297758 次浏览

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

calendar.set(Calendar.HOUR_OF_DAY, 0);

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

引用 Javadocs 的话:

公共静态最后一小时

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

还有

公共静态期末考试

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

测试(“现在”是2013年7月23日14:55 UTC-7) :

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

产出:

$ 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();
}

另一种方法是使用 DateFormat 而不需要任何秒:

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

爪哇时间

使用内置在 Java8及更高版本中的 java.time框架。

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

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

LocalDate.now(); # 2015-11-19

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

LocalTime.ofNanoOfDay(0)

还有一个 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 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();

如果您需要字符串格式00:00:00,您应该使用 SimpleDateFormat,如下所示。

Date today = new Date();
SimpleDateFormat ft = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
//not SimpleDateFormat("dd-MM-yyyy hh:mm:ss")
Calendar calendarDM = Calendar.getInstance();
calendarDM.setTime(today);
calendarDM.set(Calendar.HOUR, 0);
calendarDM.set(Calendar.MINUTE, 0);
calendarDM.set(Calendar.SECOND, 0);
System.out.println("Current Date: " + ft.format(calendarDM.getTime()));


//Result is: Current Date: 29-10-2018 00:00:00

当 Java8添加新的 Date 函数时,我们可以很容易地做到这一点。


// If you have instant, then:
Instant instant1 = Instant.now();
Instant day1 = instant1.truncatedTo(ChronoUnit.DAYS);
System.out.println(day1); //2019-01-14T00:00:00Z


// If you have Date, then:
Date date = new Date();
Instant instant2 = date.toInstant();
Instant day2 = instant2.truncatedTo(ChronoUnit.DAYS);
System.out.println(day2); //2019-01-14T00:00:00Z


// If you have LocalDateTime, then:
LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime day3 = dateTime.truncatedTo(ChronoUnit.DAYS);
System.out.println(day3); //2019-01-14T00:00
String format = day3.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(format);//2019-01-14T00:00:00




博士

myJavaUtilDate                                 // The terrible `java.util.Date` class is now legacy. Use *java.time* instead.
.toInstant()                                   // Convert this moment in UTC from the legacy class `Date` to the modern class `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) )         // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
.toLocalDate()                                 // Extract the date-only portion.
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) )   // Determine the first moment of that date in that zone. The day does *not* always start at 00:00:00.

爪哇时间

您正在使用可怕的旧日期时间类,这些类在几年前被 JSR 310中定义的现代 爪哇时间类所取代。

Date something Instant

java.util.Date表示 UTC 中的一个时刻。它的替代品是 Instant。调用添加到旧类中的新转换方法。

Instant instant = myJavaUtilDate.toInstant() ;

时区

指定您希望新的一天时间在其中有意义的时区。

指定 Continent/Region格式的 正确的时区名称,如 America/MontrealAfrica/CasablancaPacific/Auckland。不要使用2-4个字母的缩写,如 ESTIST,因为它们是 没有真正的时区,不标准化,甚至不唯一(!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;

ZonedDateTime

ZoneId应用到 Instant以获得 ZonedDateTime。同样的时间,同样的时间点,但不同的挂钟时间。

ZonedDateTime zdt = instant.atZone( z ) ;

改变一天的时间

你要求改变一天的时间。应用 LocalTime来更改一天中的所有时间部分: 小时、分钟、秒、小数秒。一个新的 ZonedDateTime被实例化,其值基于原来的。爪哇时间类使用这个 不可改变的对象模式来提供 螺纹安全

LocalTime lt = LocalTime.of( 15 , 30 ) ;  // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;

一天中的第一个时刻

但是你特别要求的是00:00。所以很明显你想要一天中的第一个时刻。注意: 有些地区的一些天不开始00:00:00。它们可能在另一个时间开始,比如01:00:00,因为夏时制(dST)等异常现象。

爪哇时间决定第一个时刻。提取只有日期的部分。然后通过时区得到第一个时刻。

LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;

调整至协调世界时

如果你需要回到协调世界时,提取一个 Instant

Instant instant = zdtFirstMomentOfDay.toInstant() ;

Instant something Date

如果需要 java.util.Date来与尚未更新为 爪哇时间的旧代码进行互操作,请转换。

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

请参阅以下代码:

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

预期产出如下:

  • 日期时间(24小时) : 2021-06-2900:00:00
  • 日期时间: 2021-06-2912:00:00

我希望这对你寻找的答案有所帮助。