从Date对象中删除时间?


70

我想从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对象,这将获得默认时间。
BalusC 2012年

您难道不从2012年3月21日得到date
Vaandu 2012年

@BalusC是的....这是理想的格式..但是,当将字符串转换回日期时,它会附加默认时间....我不想要...
Laxman Rana

您为什么要将其转换回Date当时?:)这有什么意义?该Date对象表示以毫秒的时期时间戳和这当然也包括时间。如果您的唯一目的是将其呈现给人类,则只需String像您已经将其转换为所需的格式一样即可。您只需要在将其呈现给人类的那一刻就要做。阅读javadoc:docs.oracle.com/javase/7/docs/api/java/util/Date.html(尤其是toString()方法)。
BalusC 2012年

是的,您是ri8 .....但我想通过一种接受参数作为日期而非字符串的方法来传递此日期...为此,我想将其转换为日期...
Laxman Rana 2012年

Answers:


50

快速的答案是:

不,您不能这样做。因为那是Date用来干什么的。

来自的javadoc Date

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

所需的输出字符串:2012年1月20日

在这种情况下,我们需要其他格式。

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..i我想在日期对象中输出..而不是在字符串中....当我将解析日期对象中的字符串输出时,它还将附加时间...这是我不想要的……
Laxman Rana

1
就像我说的那样,不允许您这样做,这不是要这样做的Date。您必须更改描述对象的方式Date,而不是更改Date对象
Rangi Lin 2012年

我可以阅读java.text.DateFormat还是android.text.format.DateFormat吗?
hornetbzz 2012年

@hornetbzz:我不熟悉android JDK,但是我相信android确实有格式化日期的方式。
林吉angi(Rangi Lin)2012年

2
此类答案应作为可接受的答案删除。
taylorcressy 2015年

119

通过将小时,分钟,秒和毫秒值设置为零,可以从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();
    }

}

5
这不会删除时间部分,只是将其设置为零。
Ganesh Krishnan的

4
我也想要这个确切的解决方案。感谢你的回答。
佛教阿里亚拉特涅(Buddhika Ariyaratne)2013年

5
但是,如果您想比较日期,则可以通过将每次设置都相同来实现。
WendyG

2
在任何时区都有效吗?如果我们将这样的日期存储在一个时区中,那么当您在其他时区中应用此方法时,恐怕您会得到另一个日期(d + 1或d-1)...我只想使用日历日期,例如“ aaaa-mm-dd”,没有时间。我开始认为“字符串”是表示Java中日历日期的最高级的类。
boumbh 2014年

java.util.Date与时区无关。如果要使用时区特定的日期/时间,请使用java.util.Calendar。
Sunil Manheri 2014年

36

Apache Commons DateUtils有一个“截断”方法,我刚刚使用它来完成,我认为它将满足您的需求。真的很容易使用:

DateUtils.truncate(dateYouWantToTruncate, Calendar.DAY_OF_MONTH);

DateUtils还拥有许多其他出色的实用程序,例如“ isSameDay()”等。看看吧!它可能会使您更轻松。


7
它不应该是DateUtils.truncate(dateYouWantToTruncate,Calendar.Date); ?
borjab 2014年

2
Calendar.DATE和Calendar.DAY_OF_MONTH在Java文档中被标记为同义词。
Daniel Gradinjan

12

那这个呢:

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

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

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

8

你想要的是不可能的

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

Date您应该寻找其他解决方案,而不是尝试将类用于并非为它设计的内容。例如,用于SimpleDateFormat将日期格式化为所需的任何格式。

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

Joda-Time有许多特殊的类来支持日期,时间,时间段,持续时间等。如果您只想使用没有时间的日期,那么可以使用Joda-Time的LocalDate类。


5

可能下面的代码可以帮助正在寻找零时的人:

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

希望这会有所帮助。


我可以理解您所指向的方向,这个想法很好,但是代码不清楚,并且包含许多错误。今天的日期未使用,今天的日期_G(可能是拼写错误)和今天的日期_GC也未定义(可能是拼写错误)。也没有定义gcd。
民建联

3

您可以尝试这样的事情:

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

3

您可以编写例如:

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!这个问题已有3年历史了,已经有了公认的答案。您应该回答更多当前的问题。
ByteHamster

2
Date dateWithoutTime =
    new Date(myDate.getYear(),myDate.getMonth(),myDate.getDate()) 

不建议使用此方法,但这是最快的方法。


2

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

因此,您可以做的最好的事情就是是否可以修改getStartDate用于返回a的方法LocalDate

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

输出示例:

2012年3月21日

如果您无法更改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堂课是六年前问这个问题时我们都在用的(不,不是全部;我是,而且我们很多)。java.time出来了几年后,并已取代了旧的DateCalendarSimpleDateFormatDateFormat。认识到它们的设计不当。此外,Date尽管名称不代表日期。这是一个时间点。其他答案是将时间四舍五入为JVM默认时区的一天的开始(“午夜”)。它不会删除一天中的时间,只会将其设置为通常的00:00。更改您的默认时区-就像我说的那样,即使在同一JVM中运行的另一个程序也可能在没有通知的情况下随时执行此操作-一切都会中断(经常)。

链接: Oracle教程:Date Time说明如何使用java.time


1

有点忽悠,但您可以使用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将UTC / GMT的时间设置为00:00:00(午夜)。转换为您自己的时区后,您将获得不同的时间(除非您居住在冰岛)。因此,这不是一个好的解决方案。
罗勒·布尔克

冰岛的时区全年都是UTC / GMT,没有任何夏令时(DST)的废话。如果您使用的是Mac OS X或其他不容易让您将服务器设置为UTC / GMT的时区的便捷型设备–您可以将冰岛的雷克雅未克设置为时区以有效地获取UTC / GMT。
罗勒·布尔克

1

java.util.Date表示日期/时间,以毫秒为单位。您别无选择,只能花一点时间。您可以尝试将时间清零,但是时区和夏时制将发挥作用-并且可能使事情变得更糟(e.g. 21/03/2012 0:00 GMT is 20/03/2012 PDT).

您可能希望java.sql.Date仅代表日期部分(尽管在内部它仍使用ms)。


我试图将时间清零..但我只希望没有时间就零..甚至没有0:0:00
Laxman Rana

0
String substring(int startIndex, int endIndex)

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

FinalDate = date.substring(0,9);

是的....但是我想要日期对象中的日期...所以当我将这个字符串转换为日期对象时,它也会追加时间..但是你不想要时间...
Laxman Rana

0

您还可以根据需要以“ dd / mm / yyyy”模式手动更改日期和格式的时间部分。

  public static Date getZeroTimeDate(Date changeDate){

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

如果返回值不起作用,请检查web.xml中的context参数。例如。

   <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));您需要除以时间部分,然后再次相乘。减去时间将把它带到前一天的同一时间
斯大林·吉诺2015年

0

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


1
不正确 一个java.sql.Date对象确实有一个时间的一天。该时间设置为UTC的第一天00:00:00.000。在JavaDoc中明确说明。该java.sql.Date班是一个黑客,创建,因为在其早年的Java缺乏一个日期,只输入相匹配的日期仅DATE在SQL类型。如果你真的想约会,只是没时间的日或时区的时间,使用LocalDate类(一)乔达时间或(b)新java.time在Java中8捆绑的发现
罗勒布尔克

0

除了@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)


-1

遵循简单的方法,不要试图使其变得困难

date是保存日期的字符串

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

现在输出的值s2。它会减少您的字符串长度,并且您只会得到日期部分。


只需使用Apache Utils DateUtils.truncate(dateYouWantToTruncate,Calendar.DAY_OF_MONTH);
阿南德

-1

简直无法相信所有其他人都提供了这个卑鄙的答案。它已经过时了数十年。

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

1
并被弃用是有原因的。这些方法跨时区工作不可靠。
Ole VV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.