Java 将时间设置为00:00:00
我在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 =
/**
* 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类所取代
日期
➙ <代码>即时
Ajava.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))