Java Date截止时间信息

Mar*_*rco 110 java time timestamp date

我有一个包含日期和时间信息的Java Date对象.我想写一个方法来切断时间信息,截断小时 - 分钟 - 秒,所以我只剩下日期.

输入示例:

2008-01-01 13:15:00
Run Code Online (Sandbox Code Playgroud)

预期产量:

2008-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

你有小费吗?我尝试过这样的事情:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
Run Code Online (Sandbox Code Playgroud)

但是我遇到了时区的问题.

cle*_*tus 168

建议的方式做日期/时间操作是使用Calendar对象:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
Run Code Online (Sandbox Code Playgroud)

  • @cletus,是否可以从Date对象中删除时间.我想要纯粹的日期,如2008-01-01没时间部分. (2认同)
  • 我不会说java.util.Calendar是推荐的.Sun/Oracle在Java 8中使用新的java.time包取代了该类.使用那个或Joda-Time. (2认同)
  • 不再建议使用日历。如果您使用的是Java 8,请参见http://stackoverflow.com/a/28868089/40064。 (2认同)
  • 仅供参考,麻烦的旧日期时间类如[`java.util.Calendar`](https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html)现在[遗产](https://en.wikipedia.org/wiki/Legacy_system),由[java.time]取代(https://docs.oracle.com/javase/8/docs/api/java/time/package -summary.html)类.请参阅[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html). (2认同)

A_M*_*A_M 138

你看过Apache Commons Lang 中的DateUtils truncate方法吗?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);
Run Code Online (Sandbox Code Playgroud)

将删除时间元素.

  • 再次更新链接(来到Apache!退出你的文档!) (7认同)
  • 减少执行截断操作的时区的方法总是在本地PC时区.因此,如果您使用UTC时区中的日历和日期或本地时区以外的任何时区 - 它可能会截断日期而不是预期. (6认同)

Bri*_*new 41

你看过Joda吗?这是一种简单,更直观的方式来处理日期和时间.例如,您可以在(例如)LocalDateTimeLocalDate对象之间进行简单的转换.

例如(以说明API)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()
Run Code Online (Sandbox Code Playgroud)

此外,它解决了日期/时间格式化程序的一些线程安全问题,强烈建议使用Java中的任何日期/时间问题.

  • 我相信它确实如此.建议使用更好的库而不是与破坏的java.util类进行斗争(如问题所示) (12认同)
  • 当然,它与Java有关,Joda是用于日期,时间和日历操作的库.如果不推荐它将是一种失职. (10认同)
  • -1这与问题有关吗? (5认同)
  • 我希望我能投票给所有投票的人.所有这些人都是谁,他们的回复甚至没有尝试回答这个问题?使用Joda的答案非常受欢迎,但这不是...... (4认同)

Ada*_*rry 28

根据Java 8及更高版本中内置的java.time类,快速更新.

LocalDateTime有一种truncatedTo方法可以有效地解决你在这里谈论的内容:

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)
Run Code Online (Sandbox Code Playgroud)

这将仅将当前时间表示为分钟:

2015-03-05T11:47
Run Code Online (Sandbox Code Playgroud)

您可以使用任何ChronoUnit(或实际上任何TemporalUnit)执行截断.

  • 您最多只能在DAYS内使用ChronoUnits-更高的单位将引发异常。 (2认同)

jit*_*ter 26

Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date = cal.getTime();
Run Code Online (Sandbox Code Playgroud)


h7r*_*h7r 22

使用Joda,您可以轻松获得预期日期.

从版本2.7(可能是因为某些以前的版本大于2.2),作为一个评论者注释,toDateMidnight已被弃用赞成或恰当命名withTimeAtStartOfDay(),使得方便

DateTime.now().withTimeAtStartOfDay()
Run Code Online (Sandbox Code Playgroud)

可能.

益处添加了一种更好的API.

对于旧版本,您可以这样做

new DateTime(new Date()).toDateMidnight().toDate()
Run Code Online (Sandbox Code Playgroud)

  • Joda-Time中与午夜相关的方法和类现已弃用.开发人员建议不要使用它们.而是使用方法`withTimeAtStartOfDay`. (6认同)

Gan*_*uan 7

对于时间戳:

timestamp -= timestamp % (24 * 60 * 60 * 1000)
Run Code Online (Sandbox Code Playgroud)

  • 此代码中存在一个小错误 - 左括号未正确放置,必须为时间戳 - =时间戳%(24*60*60*1000).这将切断时间部分.我确信这种方式比创建Caledar对象和使用其方法甚至使用任何其他第三方库更充分 (3认同)
  • 不,这不是正确的解决方案,请注意.这与将日期值四舍五入到楼层相同,即 - 您可能会在3月29日获得3月28日的时间戳(在您的语言环境中).所以基于日历的解决方案(Apache的DateUtils也使用Calendar)是唯一的方法 (2认同)

Ser*_*sik 7

我用新的java8 API进行了截断.我遇到了一个奇怪的事情,但总的来说它是截断的......

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
Run Code Online (Sandbox Code Playgroud)

  • 此答案仅生成 UTC 时区上下文的日期。 (2认同)

小智 6

使用Apache中的DateUtils,使用truncate,如下所示:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
Run Code Online (Sandbox Code Playgroud)


m19*_*190 6

只是clear()多余的字段。

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

从 Java 8 开始,更好的选择是使用truncatedTo方法LocalDateTime,例如:

LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)
Run Code Online (Sandbox Code Playgroud)


Sun*_*eri 5

从java.util.Date JavaDocs:

Date类表示特定的时间瞬间,精度为毫秒

并从java.sql.Date JavaDocs中获取:

为了符合SQL DATE的定义,必须通过将与实例相关联的特定时区中的小时,分​​钟,秒和毫秒设置为零,来“标准化” java.sql.Date实例包装的毫秒值。 。

因此,最好的方法是在不需要时间的情况下使用java.sql.Date

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)

输出为:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

tl;博士

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString()                                     // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
Run Code Online (Sandbox Code Playgroud)

2008-01-01T00:00+01:00[欧洲/巴黎]

要以所需格式生成字符串,请传递DateTimeFormatter.

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format(                                        // Generate a String representing the object’s value.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME       // Built-in predefined formatter close to what you want. 
)
.replace( "T" , " " )                           // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
Run Code Online (Sandbox Code Playgroud)

2008-01-01 00:00:00

细节

其他答案是正确的,但使用现在已被 java.time 框架过时的旧日期时间类。

时间

java.time 框架内置于 Java 8 及更高版本中。许多 java.time 功能向后移植到 Java 6 & 7 ( ThreeTen-Backport ) 并进一步适应 Android ( ThreeTenABP )。

首先更改输入字符串以符合 ISO 8601 格式的规范版本。默认情况下,在 java.time 类中使用标准ISO 8601格式来解析/生成表示日期时间值的字符串。我们需要用T.

String input = "2008-01-01 13:15:00".replace( " " , "T" );  // ? 2008-01-01T13:15:00
Run Code Online (Sandbox Code Playgroud)

现在我们可以将其解析为 a LocalDateTime,其中“Local”表示没有特定的位置。输入缺少任何UTC 偏移量或时区信息。

LocalDateTime ldt = LocalDateTime.parse( input );
Run Code Online (Sandbox Code Playgroud)

ldt.toString()… 2008-01-01T13:15:00

如果您不关心时间或时区,则转换为LocalDate.

LocalDate ld = ldt.toLocalDate();
Run Code Online (Sandbox Code Playgroud)

ld.toString()… 2008-01-01

一天的第一刻

相反,如果您希望将时间设置为当天的第一时刻,请使用ZonedDateTime类,然后转换为LocalDate对象以调用其atStartOfDay方法。请注意,00:00:00由于夏令时或其他异常情况,第一时刻可能不是时间。

时区至关重要,因为在任何给定时刻,世界各地的日期都会因时区而异。例如,巴黎午夜过后的几分钟对巴黎人来说是新的一天,但在蒙特利尔对加拿大人来说仍然是“昨天”。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
Run Code Online (Sandbox Code Playgroud)

zdtStartOfDay.toString()... 2008-01-01T00:00:00-05:00[美国/蒙特利尔]

世界标准时间

要通过UTC时区的镜头看到那一刻,请提取一个Instant对象。无论是ZonedDateTimeInstant将代表时间轴上同一时刻,但显示为两个不同的挂钟时间

AnInstant是 java.time 中的基本构建块类,根据定义始终使用 UTC。经常使用此类,因为您通常应该在 UTC 中进行业务逻辑、数据存储和数据交换。

Instant instant = zdtStartOfDay.toInstant();
Run Code Online (Sandbox Code Playgroud)

Instant.toString()... 2008-01-01T05:00:00Z

我们看到的是凌晨 5 点,而不是午夜。在标准格式中,Z末尾是Zulu“UTC”的缩写,意思是“UTC”。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多