设置时间为00:00:00

我有一个问题重置Java的小时。 对于给定的date,我想将小时设置为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。 这是一个appengine错误,问题或其他问题? 或者是否依赖于别的东西?

使用另一个常数而不是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:

公共静态最终诠释小时

获取和设置的字段编号,指示上午或下午的小时。 HOUR用于12小时制(0 – 11)。 中午和午夜由0表示,而不是由12表示。例如,在10点04分15秒50分,小时为10。

公共静态最终诠释HOUR_OF_DAY

get和set表示一天中的小时的字段编号。 HOUR_OF_DAY用于24小时制。 例如,在10:04:15.250 PM,HOUR_OF_DAY是22。

testing(现在是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())); } } 

输出:

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

java.time

使用Java 8及更高版本中内置的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 

这里有几个实用function我用来做到这一点。

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

这样做可能会更容易(在Java 8中)

 LocalTime.ofNanoOfDay(0) 

多一个JAVA 8的方式:

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

但是编辑已经存在的date会更有用。

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

 DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

然后你可以通过向格式化程序传递0毫秒来获得“00:00:00”的时间:

 String time = dateFormat.format(0); 

或者你可以创buildDate对象:

 Date date = new Date(0); // also pass milliseconds String time = dateFormat.foramt(date); 

或者您可以使用日历组件更多的可能性,但您也应该设置时区作为格林尼治标准时间日历实例:

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

另一种方法是使用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; }