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

259858 次浏览
String substring(int startIndex, int endIndex)

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

FinalDate = date.substring(0,9);

Java.util.日期表示一个小到毫秒的 日期/时间。你别无选择,只能把时间也算进去。你可以尝试把时间归零,但是时区和夏时制会发挥作用——这会把事情搞砸

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

答案是:

不,您不能这样做。 因为这是 Date使用的。

来自 Date的 javadoc:

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

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

例1: 通过操作字符串

输入字符串: 2012/01/2012: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: by SimpleDateFormat

输入字符串: 2012/01/2012: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

你想要的是 不可能

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

您应该寻找另一种解决方案,而不是以某种方式尝试使用类 Date来解决设计时没有考虑到的问题。例如,使用 SimpleDateFormat将日期格式设置为您想要的任何格式。

不幸的是,Java 日期和日历 API 并不是标准 JavaAPI 中设计最好的类。有一个名为 Joda 时间的库,它有一个更好、更强大的 API。

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

编辑 -注意我上面的答案已经超过10岁了。如果您正在使用 Java 的当前版本(Java8或更新版本) ,那么更喜欢使用包 java.time中新的标准日期和时间类。有许多可用的类只表示日期(日、月、年) ; 日期和时间; 只表示时间; 等等。

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

这种方法不被推崇,但却是最快的方法。

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

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


}

你可以试试这样:

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

有点不靠谱,但是你可以使用 java.sql。日期。这只存储了日期部分和从零开始的时间(午夜)

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

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

ApacheCommons 日期工具有一个 “截短”方法,我刚刚用它来完成这项工作,我认为它将满足您的需要。它真的很容易使用:

DateUtils.truncate(dateYouWantToTruncate, Calendar.DAY_OF_MONTH);

DateUtils 还有很多其他很酷的实用程序,比如 “ isSameDay ()”等等。看看这个!这可能会让你好过些。

您还可以根据需要手动更改 “ 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 是保存日期的字符串

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

现在打印 s2的值。 它会降低你的 绳子的长度和你将只得到日期的一部分。

这个怎么样:

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


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

另一种解决方法是使用 java.sql。Date as sql Date 没有时间关联,而 java.util。日期总是有一个时间戳。 这里的捕捉点是 java.sql。Date 扩展了 java.util。日期,因此是 java.util。Date 变量可以是对 java.sql 的引用。Date (没有时间)和 java.util。当然日期(带时间戳)。

你可以这样写:

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

也许下面的代码可以帮助那些寻找一天零点时间的人:

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

希望这对你有帮助。

除了@jSeal 已经说过的。我觉得 org.apache.commons. lang.time。您可能应该关注的是 DateUtils 类。

它的方法: 截断(日期日期,整型字段)对我来说非常有效。

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)

真不敢相信没有人和其他人一样给出这么糟糕的答案,它已经被废弃了几十年了。

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

用于不包含一天中的时间的日期的正确类是 LocalDateLocalDate是 Java.time (现代 Java 日期和时间 API)的一部分。

所以你能做的最好的事情就是修改你用来返回 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);

输出示例:

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 中运行的其他程序中进行更改。

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

链接: Oracle 教程: 日期时间解释如何使用 java.time

如果使用 Java8 + ,则改用 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