我在重置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。这是一个appengine bug,问题还是其他一些问题?或者它取决于其他什么?
答案 0 :(得分:173)
使用另一个常量而不是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:
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 PM,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()));
}
}
输出:
$ javac Main.java
$ java Main
2013-07-23 12:00:00
2013-07-23 00:00:00
答案 1 :(得分:18)
使用Java 8及更高版本中内置的java.time
框架。请参阅Tutorial。
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
答案 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();
}
答案 3 :(得分:3)
您最好主要将时区设置为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());
答案 4 :(得分:2)
另一种JAVA 8方式:
LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);
但是编辑已经存在的日期会更有用。
答案 5 :(得分:1)
这样做可能更容易(在Java 8中)
LocalTime.ofNanoOfDay(0)
答案 6 :(得分:1)
我们可以使用 Java 8 / Joda-datetime api的LocalDate类将 java.util.Date 时间部分设置为 00:00:00 strong>:
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
答案 7 :(得分:1)
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中定义的现代 java.time 类取代了。
Date
➙Instant
java.util.Date
代表UTC的时刻。其替换为Instant
。调用添加到旧类中的新转换方法。
Instant instant = myJavaUtilDate.toInstant() ;
指定您希望新的时间有意义的时区。
以Continent/Region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
将ZoneId
应用于Instant
以获得ZonedDateTime
。时间轴上的相同时刻,相同点,但挂钟时间不同。
ZonedDateTime zdt = instant.atZone( z ) ;
您要求更改时间。应用LocalTime
更改所有时间部分:小时,分钟,秒和小数秒。实例化一个新的ZonedDateTime
,其值基于原始值。 java.time 类使用此immutable objects模式来提供thread-safety。
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
但是您专门要求00:00。因此,显然您想要第一天的时刻。当心:某些地区的某些日子并非从00:00:00开始。由于诸如夏令时(DST)之类的异常,它们可能在其他时间(例如01:00:00)开始。
让 java.time 确定第一时刻。提取仅日期部分。然后通过时区以获取第一时间。
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
如果您需要返回UTC,请提取Instant
。
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙Date
如果您需要java.util.Date
与尚未更新为 java.time 的旧代码进行互操作,请进行转换。
java.util.Date d = java.util.Date.from( instant ) ;
答案 8 :(得分:1)
查看以下代码:
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));
预期输出如下:
希望它对您正在寻找的答案有所帮助。
答案 9 :(得分:0)
另一种方法是使用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;
}
答案 10 :(得分:0)
您可以使用以下方法执行此操作:
Calendar cal = Calendar.getInstance();
cal.set(year, month, dayOfMonth, 0, 0, 0);
Date date = cal.getTime();
答案 11 :(得分:0)
如果需要字符串格式00:00:00,则应使用SimpleDateFormat,如下所示。使用“ H”代替“ h”。
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
答案 12 :(得分:0)
随着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
答案 13 :(得分:0)
另一种简单的方法,
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);
答案 14 :(得分:0)
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))