【问题标题】:Removing time from a Date object?从日期对象中删除时间?
【发布时间】:2021-01-22 00:02:00
【问题描述】:

我想从Date 对象中删除时间。

DateFormat df;
String date;
df = new SimpleDateFormat("dd/MM/yyyy");
d = eventList.get(0).getStartDate(); // I'm getting the date using this method
date = df.format(d); // Converting date in "dd/MM/yyyy" format

但是当我转换这个日期(String 格式)时,它也在附加时间。

我根本不需要时间。我想要的只是“21/03/2012”。

【问题讨论】:

  • 最后一行之后的System.out.println(date) 是什么意思呢?它肯定已经是所需的格式,对吧?否则,您实际上还没有发布完整的代码。例如,您可能稍后将其转换回 Date 对象,这将获得默认时间。
  • 你从date得到的不是21/03/2012吗?
  • @BalusC 是的......这是所需的格式......但是当将字符串转换回日期时,它会附加默认时间......我不想要......
  • 那你为什么要把它转换回Date呢? :) 这有什么意义? Date 对象表示以毫秒为单位的纪元时间戳,当然这也包括时间。如果您的唯一目的是将其呈现给人类,只需像您已经做的那样以所需格式转换为String。您只需要在您将其呈现给人类的那一刻执行此操作。阅读 javadoc:docs.oracle.com/javase/7/docs/api/java/util/Date.html(尤其是 toString() 方法)。
  • yes ur ri8 .....但是我想通过一种方法传递这个日期,该方法接受参数作为日期而不是字符串......所以为此我想将它转换为日期.. .

标签: java datetime date


【解决方案1】:

您可以通过将小时、分钟、秒和毫秒值设置为零来从 java.util.Date 中删除时间部分。

import java.util.Calendar;
import java.util.Date;

public class DateUtil {

    public static Date removeTime(Date 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);
        return cal.getTime();
    }

}

【讨论】:

  • 这不会删除时间部分,只是将其设置为零。
  • 我也想要这个精确的解决方案。感谢您的回答。
  • 但是如果你想比较日期,这可以通过将每个时间设置为相同来实现。
  • 无论在哪个时区都能正常工作吗?如果我们将这样的日期存储在时区中,恐怕当您将此方法应用于其他时区时,您可能会获得其他日期(d+1 或 d-1)......我只想使用日历日期,如“aaaa-mm-dd”,没有时间。我开始认为“String”是在 Java 中表示日历日期的最高级的类。
  • java.util.Date 与时区无关。如果您想使用时区特定的日期/时间,请使用 java.util.Calendar。
【解决方案2】:

快速回答是:

不,你不能这样做。因为那是 Date 的用途。

来自Date的javadoc:

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

然而,因为这个类只是一个数据对象。它不关心我们如何描述它。 当我们看到一个日期2012/01/01 12:05:10.321,我们可以说它是2012/01/01,这就是你需要的。 有很多方法可以做到这一点。

示例1:通过操作字符串

输入字符串:2012/01/20 12:05:10.321

所需的输出字符串:2012/01/20

由于 yyyy/MM/dd 正是我们所需要的,我们可以简单地操作字符串来得到结果。

String input = "2012/01/20 12:05:10.321";
String output = input.substring(0, 10);  // Output : 2012/01/20

示例 2:SimpleDateFormat

输入字符串:2012/01/20 12:05:10.321

所需的输出字符串:01/20/2012

在这种情况下,我们需要不同的格式。

String input = "2012/01/20 12:05:10.321";
DateFormat inputFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
Date date = inputFormatter.parse(input);

DateFormat outputFormatter = new SimpleDateFormat("MM/dd/yyyy");
String output = outputFormatter.format(date); // Output : 01/20/2012

SimpleDateFormat的用法,请查看SimpleDateFormat JavaDoc

【讨论】:

  • @Rangi ..我想在日期对象中输出..而不是在字符串中..当我在日期对象中解析 字符串输出时,它也会附加时间.. .我不想要......
  • 正如我所说,你不能这样做,这不是Date 的用途。你必须改变你描述Date的方式,而不是改变Date对象
  • 我可以阅读 java.text.DateFormat 还是 android.text.format.DateFormat 吗?
  • @hornetbzz : 我不熟悉 android JDK,但我相信 android 确实有自己的方式来格式化日期。
  • 这样的答案,应该作为接受的答案被删除。
【解决方案3】:

Apache Commons DateUtils 有一个 "truncate" 方法,我只是用来执行此操作,我认为它会满足您的需求。它真的很容易使用:

DateUtils.truncate(dateYouWantToTruncate, Calendar.DAY_OF_MONTH);

DateUtils 还有许多其他很酷的实用程序,例如 "isSameDay()" 等。看看吧!它可能会让你的事情变得更容易。

【讨论】:

  • 不应该是DateUtils.truncate(dateYouWantToTruncate, Calendar.Date); ?
  • Calendar.DATE 和 Calendar.DAY_OF_MONTH 在 java 文档中被标记为同义词。
【解决方案4】:

这个呢:

    Date today = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

    today = sdf.parse(sdf.format(today));

【讨论】:

  • 当已经有可用的类(日历)直接更改所需日期的组件时,将日期转换为字符串然后再次解析它不是一个好的解决方案。
【解决方案5】:

你想要的是不可能

Date 对象代表“绝对”时间。您不能从中“删除时间部分”。当您直接使用System.out.println(date) 打印Date 对象时,它将始终以包含时间的默认格式进行格式化。你无法改变这一点。

与其以某种方式尝试将Date 类用于不是为它设计的东西,不如寻找另一种解决方案。例如,使用SimpleDateFormat 将日期格式化为您想要的任何格式。

遗憾的是,Java 日期和日历 API 并不是标准 Java API 中设计最完善的类。有一个名为 Joda-Time 的库,它拥有更好、更强大的 API。

Joda-Time 有许多特殊的类来支持日期、时间、期间、持续时间等。如果您只想使用没有时间的日期,那么 Joda-Time 的 LocalDate 类将是您的理想选择d 使用。

【讨论】:

    【解决方案6】:

    下面的代码可能会帮助那些正在寻找一天中的零小时的人:

        Date todayDate = new Date();
        GregorianCalendar todayDate_G = new GregorianCalendar();
        gcd.setTime(currentDate);
        int _Day    = todayDate_GC.get(GregorianCalendar.DAY_OF_MONTH);
        int _Month  = todayDate_GC.get(GregorianCalendar.MONTH);
        int _Year   = todayDate_GC.get(GregorianCalendar.YEAR);
    
        GregorianCalendar newDate = new GregorianCalendar(_Year,_Month,_Day,0,0,0);
        zeroHourDate = newDate.getTime();
        long zeroHourDateTime = newDate.getTimeInMillis();
    

    希望这会有所帮助。

    【讨论】:

    • 我能看懂你指的方向,思路不错,但是代码不清晰,有很多错误。未使用 todayDate,也未使用 todayDate_G(可能拼写错误)和 todayDate_GC 未定义(可能拼写错误)。也没有定义 gcd。
    【解决方案7】:
    Date dateWithoutTime =
        new Date(myDate.getYear(),myDate.getMonth(),myDate.getDate()) 
    

    这已被弃用,但却是最快的方法。

    【讨论】:

      【解决方案8】:

      你可以试试这样的:

      import java.text.*;
      import java.util.*;
      public class DtTime {
      public static void main(String args[]) {
      String s;
      Format formatter;
        Date date = new Date();
        formatter = new SimpleDateFormat("dd/MM/yyyy");
        s = formatter.format(date);
        System.out.println(s);
          }
      }
      

      这会给你输出21/03/2012

      如果您希望输出为21 Mar, 2012,也可以试试这个

      import java.text.*;
      import java.util.*;
      public class DtTime {
      public static void main(String args[]) {
          Date date=new Date();
      String df=DateFormat.getDateInstance().format(date);
      System.out.println(df);
          }
      }
      

      【讨论】:

        【解决方案9】:

        你可以这样写,例如:

        private Date TruncarFecha(Date fechaParametro) throws ParseException {
            String fecha="";
            DateFormat outputFormatter = new SimpleDateFormat("MM/dd/yyyy");
            fecha =outputFormatter.format(fechaParametro);
            return outputFormatter.parse(fecha);
        }
        

        【讨论】:

        • 欢迎来到 Stack Overflow!这个问题已经存在三年了,并且已经有了一个公认的答案。您应该回答更多当前的问题。
        【解决方案10】:

        用于没有时间的日期的正确类是LocalDateLocalDate 是现代 Java 日期和时间 API java.time 的一部分。

        所以你能做的最好的事情是如果你可以修改你用来返回LocalDategetStartDate方法:

            DateTimeFormatter dateFormatter = DateTimeFormatter
                    .ofLocalizedDate(FormatStyle.SHORT)
                    .withLocale(Locale.forLanguageTag("en-IE"));
        
            LocalDate d = eventList.get(0).getStartDate(); // We’re now getting a LocalDate using this method
            String dateString = d.format(dateFormatter);
            System.out.println(dateString);
        

        示例输出:

        21/03/2012

        如果您无法更改getStartDate,您仍然可以添加一个返回我们想要的类型的新方法。但是,如果您现在不能这样做,请转换您获得的老式Date(我假设java.util.Date):

            d = eventList.get(0).getStartDate(); // I'm getting the old-fashioned Date using this method
            LocalDate dateWithoutTime = d.toInstant()
                    .atZone(ZoneId.of("Asia/Kolkata"))
                    .toLocalDate();
        

        请插入假定为Date 的时区。你可以使用ZoneId.systemDefault()作为JVM的时区设置,只有这个设置可以随时从你程序的其他部分或运行在同一JVM中的其他程序中更改。

        java.util.Date 类是 6 年前被问到这个问题时我们都在使用的(不,不是全部;我是,而且我们很多)。 java.time 几年后问世并取代了旧的DateCalendarSimpleDateFormatDateFormat。认识到他们的设计很糟糕。此外,Date 尽管它的名称不能代表日期。这是一个时间点。其他答案的作用是将时间四舍五入到 JVM 默认时区的一天开始(“午夜”)。它不会删除一天中的时间,只会将其设置为 00:00。改变你的默认时区——正如我所说,即使是在同一个 JVM 中运行的另一个程序也可能在没有通知的情况下随时这样做——一切都会中断(经常)。

        链接:Oracle tutorial: Date Time解释如何使用java.time

        【讨论】:

          【解决方案11】:

          有点软糖,但您可以使用 java.sql.Date。这仅存储了日期部分和基于零的时间(午夜)

          Calendar c = Calendar.getInstance();
          c.set(Calendar.YEAR, 2011);
          c.set(Calendar.MONTH, 11);
          c.set(Calendar.DATE, 5);
          java.sql.Date d = new java.sql.Date(c.getTimeInMillis());
          System.out.println("date is  " + d);
          DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
          System.out.println("formatted date is  " + df.format(d));
          

          给予

          date is  2011-12-05
          formatted date is  05/12/2011
          

          或者可能值得创建自己的日期对象,它只包含日期而不是时间。这可以包装 java.util.Date 并忽略它的时间部分。

          【讨论】:

          • 使用 java.sql.Date 将一天中的时间设置为 00:00:00(午夜)对于 UTC/GMT。当翻译到您自己的时区时,您将获得不同的时间(除非您住在冰岛)。所以这不是一个好的解决方案。
          • Iceland 的时区全年都是 UTC/GMT,没有任何夏令时 (DST) 废话。如果您使用 Mac OS X 或其他不容易让您将服务器设置为 UTC/GMT 作为时区的操作系统,这是一个方便的事实——您可以将冰岛雷克雅未克设置为有效获取 UTC/GMT 的时区。
          【解决方案12】:

          java.util.Date 表示日期/时间,精确到毫秒。您别无选择,只能在其中加入时间。您可以尝试将时间归零,但随后时区和夏令时将发挥作用——这可能会把事情搞砸(e.g. 21/03/2012 0:00 GMT is 20/03/2012 PDT).

          您可能想要一个 java.sql.Date 来仅表示日期部分(尽管在内部它仍然使用 ms)。

          【讨论】:

          • 我试图将时间归零..但我只想要日期没有时间..甚至 0:0:00
          【解决方案13】:
          String substring(int startIndex, int endIndex)
          

          换句话说,您知道您的字符串长度为 10 个字符,因此您可以这样做:

          FinalDate = date.substring(0,9);
          

          【讨论】:

          • 是的....但是我想要 Date 对象中的日期...所以当我将这个字符串转换为 Date 对象时,它也会附加时间..但是你不想要时间...跨度>
          【解决方案14】:

          另一种解决方法是使用 java.sql.Date,因为 sql Date 没有与之关联的时间,而 java.util.Date 总是有时间戳。 这里的重点是 java.sql.Date 扩展了 java.util.Date,因此 java.util.Date 变量可以是对 java.sql.Date(没有时间)和 java.util.Date 的引用(带有时间戳) )。

          【讨论】:

          • 不正确。 java.sql.Date 对象确实有时间。该时间设置为 UTC 中一天的第一刻,00:00:00.000。 JavaDoc 中明确说明。 java.sql.Date 类是一个 hack,创建是因为 Java 在其早期缺乏仅日期类型来匹配仅日期 DATE type in SQL。如果您确实想要一个没有任何时间或时区的仅日期,请使用 (a) Joda-Time 或 (b) Java 8 中捆绑的新 java.time 中的 LocalDate 类。
          【解决方案15】:

          除了@jseals 已经说过的话。我认为 org.apache.commons.lang.time.DateUtils 类可能是你应该看的。

          它的方法:truncate(Date date,int field) 对我来说效果很好。

          JavaDocs : https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html#truncate(java.util.Date, int)

          由于您需要截断所有可以使用的时间字段:

          DateUtils.truncate(new Date(),Calendar.DAY_OF_MONTH)
          

          【讨论】:

            【解决方案16】:

            如果您使用的是 Java 8+,请改用 java.time.LocalDate 类型。

            LocalDate now = LocalDate.now();
            System.out.println(now.toString());
            

            输出:

            2019-05-30
            

            https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

            【讨论】:

            • 没有解决问题。问题始于手中的Date 对象。问题不是要求当前日期。我们已经有a complete Answer 使用LocalDate
            【解决方案17】:

            您也可以根据自己的需要,手动更改"dd/mm/yyyy"模式中日期的时间部分和格式。

              public static Date getZeroTimeDate(Date changeDate){
            
                    Date returnDate=new Date(changeDate.getTime()-(24*60*60*1000));
                    return returnDate;
                }
            

            如果返回值无效,则检查 web.xml 中的上下文参数。 例如。

               <context-param> 
                    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
                    <param-value>true</param-value>
                </context-param>
            

            【讨论】:

            • Date returnDate=new Date((changeDate.getTime()/(24*60*60*1000))*(24*60*60*1000)); 您需要将时间分量相除并再次相乘。减去时间将把它带到前一天的同一时间
            【解决方案18】:

            不要试图让事情变得困难,只需遵循简单的方法

            date 是保存日期的字符串

            String s2=date.substring(0,date.length()-11);
            

            现在打印s2 的值。 它会减少你的字符串长度,你只会得到日期部分。

            【讨论】:

            • 只需使用 Apache Utils DateUtils.truncate(dateYouWantToTruncate, Calendar.DAY_OF_MONTH);
            【解决方案19】:

            不敢相信没有人对其他所有人提供这个糟糕的答案。它已被弃用数十年。

            @SuppressWarnings("deprecation")
            ...
                Date hitDate = new Date();
                hitDate.setHours(0);
                hitDate.setMinutes(0);
                hitDate.setSeconds(0);
            

            【讨论】:

            • 出于某种原因已弃用。这些方法跨时区工作不可靠。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-12
            • 1970-01-01
            • 1970-01-01
            • 2012-11-23
            • 2016-04-09
            • 2018-08-20
            相关资源
            最近更新 更多