设置时间为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; }