从Date对象中删除时间?

时间:2012-03-22 04:29:38

标签: java datetime date

我想从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”。

19 个答案:

答案 0 :(得分:108)

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

}

答案 1 :(得分:43)

快速回答是:

不,您不被允许这样做。因为这是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

答案 2 :(得分:28)

Apache Commons DateUtils 有一个“truncate”方法,我刚才这样做,我认为它会满足您的需求。它真的很容易使用:

DateUtils.truncate(dateYouWantToTruncate, Calendar.DAY_OF_MONTH);

DateUtils 还有许多其他酷工具,例如“isSameDay()”等。看看吧!它可能会让你更容易。

答案 3 :(得分:12)

这个怎么样:

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

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

答案 4 :(得分:8)

你想要的是不可能

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

不应该以某种方式尝试将类Date用于不适合的事情,而应该寻找另一种解决方案。例如,使用SimpleDateFormat以您想要的任何格式格式化日期。

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

Joda-Time有许多特殊的课程来支持日期,时间,时间段,持续时间等。如果你想要一个没有时间的日期,那么Joda-Time的LocalDate课程将是什么你会用的。

答案 5 :(得分:4)

可能是以下代码可能会帮助那些正在寻找零时的人:

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

希望这会有所帮助。

答案 6 :(得分: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);
    }
}

答案 7 :(得分: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);
}

答案 8 :(得分:2)

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

这是不推荐使用的,但却是最快的方法。

答案 9 :(得分:1)

java.util.Date表示日期/时间,直到毫秒。您没有选择,只能包含时间。您可以尝试将时间归零,但是时区和夏令时会发挥作用 - 这可能会让事情变得紧张(e.g. 21/03/2012 0:00 GMT is 20/03/2012 PDT).

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

答案 10 :(得分:1)

如果您使用的是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

答案 11 :(得分:1)

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

因此,您最好的办法是修改可以返回getStartDate的{​​{1}}方法:

LocalDate

示例输出:

  

21/03/2012

如果您无法更改 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); ,则仍然可以添加新方法来返回所需的类型。但是,如果您现在负担不起,请转换您得到的老式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用于JVM的时区设置,只有您可以随时从程序的其他部分或在同一JVM中运行的其他程序更改此设置。

ZoneId.systemDefault()类是6年前问这个问题时我们都使用的类(不,不是全部;我是,而且我们很多)。 java.time于几年后问世,并取代了旧的java.util.DateDateCalendarSimpleDateFormat。认识到它们的设计不当。此外,DateFormat的名字不能代表日期。这是一个时间点。其他答案是将时间四舍五入到JVM的默认时区中的一天的开始(“午夜”)。它不会删除一天中的时间,只会将其设置为通常的00:00。更改您的默认时区-就像我说的那样,即使是在同一JVM中运行的另一个程序也可能会在没有通知的情况下随时执行此操作-一切都会中断(通常)。

链接: Oracle tutorial: Date Time解释了如何使用Date

答案 12 :(得分: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并忽略它的时间部分。

答案 13 :(得分:0)

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

答案 14 :(得分: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>

答案 15 :(得分: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)

答案 16 :(得分:0)

String substring(int startIndex, int endIndex)

换句话说,你知道你的字符串将是10个字符,所以你会这样做:

FinalDate = date.substring(0,9);

答案 17 :(得分:-1)

不要试图通过简单的方式使其变得困难

日期是保存日期的字符串

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

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

答案 18 :(得分:-1)

简直不敢相信任何其他人都没有提供这个卑鄙的答案。它已经过时了数十年。

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