我想从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”。
答案 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)
没有日期的日期使用的正确类是LocalDate
。 LocalDate
是现代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.Date
,Date
,Calendar
和SimpleDateFormat
。认识到它们的设计不当。此外,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)对我来说效果非常好。
由于您需要截断所有可以使用的时间字段:
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);