java 00_关于java:将时间设置为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。 这是Appengine错误,问题还是其他问题? 还是取决于其他因素?

这可能与不同的语言环境有关吗,还是总是在同一台PC上发生?

我在appengine上部署时会发生这种情况。

许多其他缩短时间的解决方案:stackoverflow.com/a/1908955/2646526

仅供参考,麻烦的旧日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)现在已被遗留,由内置于Java 8和Java 9中的java.time类取代。请参见Oracle教程。

我使用calendar.set(Calendar.HOUR_OF_DAY, 0);来达到目的。

使用另一个常量代替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

Field number for get and set indicating

the hour of the morning or afternoon. HOUR is used for the 12-hour

clock (0 - 11). Noon and midnight are represented by 0, not by 12.

E.g., at 10:04:15.250 PM the HOUR is 10.

public static final int HOUR_OF_DAY

Field number for get and set

indicating the hour of the day. HOUR_OF_DAY is used for the 24-hour

clock. E.g., at 10:04:15.250 PM the HOUR_OF_DAY is 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

@JarrodRoberson但是使用Calendar.HOUR不会将PM设置为AM,而将其保留为中午12:00。

您能帮我构建小时,分钟和秒的LocalDate吗?我知道一种选择是遵循DateTime。

谁创建了HOUR和HOUR_OF_DAY字段,谁都应该弄乱并配给口粮。

@AndroidDev发明am / pm的人都应该得到同样的结果...这也适用于非度量标准

仅供参考,麻烦的旧日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)现在已被遗留,由内置在Java 8和Java 9中的java.time类取代。请参见Oracle教程。

一切都正确,但也应该有毫秒。now.set(Calendar.MILLISECOND,0);

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

自从首次提出此问题以来,Java 1.8已经发布,这应该是新的接受的答案。

LocalDateTime正是为此使用的错误类。由于它缺少时区或UTC偏移量的概念,因此无法表示一个时刻。调用LocalDateTime.now几乎没有任何意义。请使用ZonedDateTime。否则,您将忽略关键的时区问题。一方面,某些区域中的某些日期不是从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();

}

JAVA 8的另一种方式:

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

但是,编辑已经存在的日期会更加有用。

LocalDateTime无法表示时刻,因为它缺少时区或UTC偏移的概念。调用LocalDateTime.now几乎没有任何意义。您应该改用ZonedDateTime。

您最好主要将时区设置为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);

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

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

tl; dr

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.

java.time

您正在使用可怕的旧日期时间类,而这些类早已被JSR 310中定义的现代java.time类取代了。

Date? Instant

java.util.Date代表UTC时刻。其替换为Instant。调用添加到旧类中的新转换方法。

Instant instant = myJavaUtilDate.toInstant() ;

时区

指定您希望新的时间有意义的时区。

以Continent/Region格式指定正确的时区名称,例如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类使用此不可变对象模式来提供线程安全性。

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

如果需要返回UTC,请提取Instant。

Instant instant = zdtFirstMomentOfDay.toInstant() ;

Instant? Date

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

java.util.Date d = java.util.Date.from( instant ) ;

我们可以使用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

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

LocalTime.ofNanoOfDay(0)

谢谢,我在过去的两年中和其他的Java 6/7一起工作过。我现在回到Java(在Groovy上做了一些工作之后),喜欢Java 8的不同之处。

随着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

LocalDateTime无法表示时刻,因为它缺少时区或UTC偏移的概念。调用LocalDateTime.now几乎没有任何意义。您应该改用ZonedDateTime。

如果需要字符串格式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

您可以执行以下操作:

Calendar cal = Calendar.getInstance();

cal.set(year, month, dayOfMonth, 0, 0, 0);

Date date = cal.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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值