【问题标题】:How to remove milliseconds from Date Object format in Java如何从 Java 中的日期对象格式中删除毫秒
【发布时间】:2019-03-23 12:24:36
【问题描述】:

由于java.util.Date 对象将日期存储为2014-01-24 17:33:47.214,但我希望日期格式为2014-01-24 17:33:47我想删除毫秒部分。

我检查了一个与我的问题相关的问题...

How to remove sub seconds part of Date object

我已经尝试了给定的答案

long time = date.getTime();
date.setTime((time / 1000) * 1000);

但我的结果日期格式为2014-01-24 17:33:47.0。如何从我的日期格式中删除 0 ???

【问题讨论】:

  • 日期无关紧要。向我们展示格式化代码。
  • 一个日期对象代表长毫秒,你不能把它除以 1000 只显示小时.. 可能你需要通过文档
  • 我相信他们打算使用date.setTime(Math.round(time / 1000) * 1000);(请参阅下面的答案)
  • @NickG:鉴于time / 1000 始终是整数,那么舍入它有什么意义?
  • 时间值很长,舍入没有意义。

标签: java java.util.date


【解决方案1】:

tl;博士

去掉小数秒。

myJavaUtilDate.toInstant()                         // Convert from legacy class to modern class. Returns a `Instant` object.
              .truncatedTo( ChronoUnit.SECONDS )   // Generate new `Instant` object based on the values of the original, but chopping off the fraction-of-second.

在生成String 时隐藏小数秒。

myJavaUtilDate.toInstant()                         // Convert from legacy class to modern class. Returns a `Instant` object.
              .atOffset( ZoneOffset.UTC )          // Return a `OffsetDateTime` object. 
              .format( DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ). // Ask the `OffsetDateTime` object to generate a `String` with text representing its value, in a format defined in the `DateTimeFormatter` object.

避免使用旧的日期时间类

您正在使用麻烦的旧日期时间类,现在是遗留的,被 java.time 类所取代。

Instant

通过调用添加到旧类的新方法,将旧的java.util.Date 对象转换为java.time.Instant

Instant instant = myJavaUtilDate.toInstant() ;

截断

如果您想更改数据本身的值以减少几分之一秒,您可以截断。 java.time 类使用immutable objects,因此我们生成一个新对象而不是更改(变异)原始对象。

Instant instantTruncated = instant.truncatedTo( ChronoUnit.SECONDS );

生成字符串

如果您不想截断,而只是想在生成表示日期时间值的字符串时不显示小数秒,请定义一个格式化程序以满足您的需要。

例如,“uuuu-MM-dd HH:mm:ss”没有提到小数秒,因此数据中包含的任何毫秒根本不会出现在生成的字符串中。

Instant 转换为OffsetDateTime 以获得更灵活的格式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC )
String output = odt.format( f );

时区

请注意,您的问题忽略了时区问题。如果您打算使用 UTC,则上述代码的工作原理是 DateInstant 根据定义使用 UTC。相反,如果您想通过某个地区的wall-clock time 的镜头感知给定的数据,请应用时区。在 Stack Overflow 中搜索 ZoneIdZonedDateTime 类名以获取更多信息。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

  • 赞成。更短:Date now = Date.from(Instant.now().truncatedTo( ChronoUnit.SECONDS));,并且通常停止使用 Date,因为它已被弃用。
【解决方案2】:

基本答案是,你不能。 Date#toString 返回的值是 Date 对象的表示形式,除了在 toString 方法内部使用的格式之外,它没有任何格式概念。

一般不应将其用于显示目的(极少数情况除外)

相反,您应该使用某种DateFormat

例如...

Date date = new Date();
System.out.println(date);
System.out.println(DateFormat.getDateTimeInstance().format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(date));

会输出类似...

Thu Jan 30 16:29:31 EST 2014
30/01/2014 4:29:31 PM
30/01/14 4:29 PM
30/01/2014 4:29:31 PM
30 January 2014 4:29:31 PM

如果您真的卡住了,您可以使用SimpleDateFormat 进一步自定义它,但如果可以的话,我会避免这种情况,因为不是每个人都使用相同的日期/时间格式;)

【讨论】:

  • 我回答这个问题时是 2014 年 Jaburary,Java 8 直到 2014 年 3 月才问世,因此我们没有“新的和闪亮的”java.time API。那么,在这个事实上,它会吸引反对票的答案有什么问题呢?我同意,Basil 的答案是最新的,并且是在此之后 3 年提出的
【解决方案3】:

您可以使用SimpleDateFormatter。请看以下代码。

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
Date now = date.getTime();
System.out.println(formatter.format(now));

【讨论】:

    【解决方案4】:

    使用 Apache 的 DateUtils:

    import org.apache.commons.lang.time.DateUtils;
    ...
    DateUtils.truncate(new Date(), Calendar.SECOND)
    

    【讨论】:

    • 我痛苦地了解到,这不会截断 MILLISECOND。如果要截断毫秒,请使用 Calendar.SECOND。
    • @Dargenn 我的错,我是从我的代码翻译过来的。我修改了答案。
    • 还有一个round 方法可以舍入而不是截断。对于那些想要的人。
    【解决方案5】:

    截断为秒(没有毫秒),返回一个新的日期:

    public Date truncToSec(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.set(Calendar.MILLISECOND, 0);
        Date newDate = c.getTime();
        return newDate;
    }
    

    【讨论】:

      【解决方案6】:

      您可以根据需要使用SimpleDateFormat 类来格式化日期。由于可能组合的多样性,我将在此处简单地包含文档链接:

      http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

      您的代码将类似于以下内容:

      System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(date));
      

      【讨论】:

        【解决方案7】:

        仅作记录,post you linked 给出的公认答案有效:

        public static void main(String[] args) {
               SimpleDateFormat df = new SimpleDateFormat("S");
               Date d = new Date();
               System.out.println(df.format(d));
               Calendar c = Calendar.getInstance();
               c.set(Calendar.MILLISECOND, 0);
               d.setTime(c.getTimeInMillis());
               System.out.println(df.format(d));
        
        }
        

        【讨论】:

          【解决方案8】:

          请尝试以下日期格式化程序:

          import java.text.*;
          SimpleDateFormat tmp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
          System.out.println(tmp.format(date));
          

          【讨论】:

          • 您认为使用long 值调用Math.round 的好处是什么?已经是整数了……
          • @JonSkeet,谢谢乔恩,我已经根据您的反馈更新了答案!
          • 您现在得到的代码与 OP 在问题中的代码相同,但它并没有按照他的意愿行事。问题实际上与格式有关 - 如果 OP 使用不包括毫秒部分的格式,则无需首先更改值。
          • @JonSkeet,关于格式,请参阅下面的部分。
          • HH:mm:ss SSS 仍将打印毫秒,OP 正试图完全摆脱它们...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-10
          • 2014-10-21
          • 1970-01-01
          • 2013-07-04
          相关资源
          最近更新 更多