如何从 Java 中的 Date 对象中减去 X 天?
Posted
技术标签:
【中文标题】如何从 Java 中的 Date 对象中减去 X 天?【英文标题】:How to subtract X day from a Date object in Java? 【发布时间】:2012-08-06 15:35:30 【问题描述】:我想做这样的事情:
Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"
怎么做?
【问题讨论】:
强制性“使用 Joda Time”备注。 以下链接可能对您有用。[在此处输入链接描述][1] [在此处输入链接描述][2] [1]:***.com/questions/212321/… [2]:***.com/questions/2623610/… 仅供参考,麻烦的旧日期时间类,如java.util.Date
现在是 legacy,被 java.time 类取代。
【参考方案1】:
Java 8 及更高版本
随着 Java 8 的日期时间 API 更改,使用 LocalDate
LocalDate date = LocalDate.now().minusDays(300);
同样可以
LocalDate date = someLocalDateInstance.minusDays(300);
java.util.Date java.time.LocalDateTime 之间的转换参考https://***.com/a/23885950/260990
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Java 7 及更早版本
使用Calendar
的add()
方法
Calendar cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();
【讨论】:
这是设置您的自定义 dateInstance 以防您不想考虑当前日期时间 Java 的日期处理如此臃肿! 这是 4 岁的答案。对它的最新版本进行了新的 DateTime API 更改。我会编辑答案 仅供参考,麻烦的旧日期时间类,如java.util.Date
、java.util.Calendar
和 java.text.SimpleTextFormat
现在是 legacy,被 java.time 类取代。见Tutorial by Oracle。
@JigarJoshi 如果您使用 Java 8 API 更新您的答案,那就太好了。您的答案是人们首先看到的公认答案。【参考方案2】:
@JigarJoshi 这是一个很好的答案,当然还有@Tim 推荐使用.joda-time。
我只想添加更多可能性,以从 java.util.Date
中减去天数。
Apache-commons
一种可能性是使用apache-commons-lang。您可以使用DateUtils
执行此操作,如下所示:
Date dateBefore30Days = DateUtils.addDays(new Date(),-30);
当然,添加 commons-lang
依赖项来仅做日期减法可能不是一个好的选择,但是如果您已经在使用 commons-lang
,这是一个不错的选择。还有addYears
,addMonths
,addWeeks
等方便的方法,看看api here吧。
Java 8
另一种可能性是使用minusDays(long days)
方法从Java 8 中利用新的LocalDate
:
LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);
【讨论】:
没有必要使用LocalDateTime
,因为该类故意没有时区概念,也没有与UTC的偏移量。仅在区域/偏移量未知或不相关时使用。而是使用LocalDate
并在调用now
方法时传递ZoneId
。请参阅 Jacob van Lingen 的 correct Answer。
@BasilBourque 根据您的建议,我检查了 api,您是完全正确的,因此我更新了答案。谢谢。
Brian Montellano 想评论:DateUtils
中不应该有任何s
,它只是DateUtil
。
@OleV.V. Brian Montellano 错了,你可以查看DateUtils
文档【参考方案3】:
只需使用它来获取 300 天之前的日期,将 300 替换为您的天数:
Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();
这里,
DateTime
是org.joda.time.DateTime;
Date
是java.util.Date
【讨论】:
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。【参考方案4】:Java 8 时间 API:
Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);
【讨论】:
我的意思是 Java 8 API,而不是 7。提到包java.time
可能会有所帮助。此外,通常需要在 Stack Overflow 上进行一些讨论/解释,而不仅仅是代码 sn-p。您绝对应该解释Duration
,因为这是您的答案超过the existing one by van Lingen 的附加值。
Java 8 的原因,已修复
如此接近,但应该用于修改任意日期对象,而不是“现在”【参考方案5】:
如您所见HERE,您可以进行很多操作。这是一个展示你可以做什么的例子!
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
//Add one day to current date.
cal.add(Calendar.DATE, 1);
System.out.println(dateFormat.format(cal.getTime()));
//Substract one day to current date.
cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(dateFormat.format(cal.getTime()));
/* Can be Calendar.DATE or
* Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND
*/
【讨论】:
@Jigar Joshi:我没有看到你的答案...我应该删除我的吗? 仅供参考,非常麻烦的旧日期时间类,例如java.util.Date
、java.util.Calendar
和 java.text.SimpleDateFormat
现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。【参考方案6】:
现在使用 Java 8 真的很简单:
LocalDate date = LocalDate.now().minusDays(300);
可以在here 找到有关新 API 的精彩指南。
【讨论】:
我建议始终将可选时区(或从 UTC 偏移)传递给now
方法。如果省略,JVM 的当前默认时区将被隐式且静默地应用。该默认值不在您的控制范围内,并且可以随时更改,即使在在运行时。示例:LocalDate.now( ZoneId.of( "America/Montreal" )
.
根据问题需要在任意日期对象上,而不是“现在”【参考方案7】:
我创建了一个函数来简化任务。
dateString 后 7 天:dateCalculate(dateString,"yyyy-MM-dd",7);
要获得 7 天的最新日期字符串:dateCalculate(dateString,"yyyy-MM-dd",-7);
public static String dateCalculate(String dateString, String dateFormat, int days)
Calendar cal = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(dateFormat);
try
cal.setTime(s.parse(dateString));
catch (ParseException e)
e.printStackTrace();
cal.add(Calendar.DATE, days);
return s.format(cal.getTime());
【讨论】:
此答案使用麻烦的旧日期时间类,例如java.util.Date
、java.util.Calendar
和 java.text.SimpleDateFormat
,现在是 legacy,被 java.time 类取代。见Tutorial by Oracle。
该问题涉及日期时间对象,而不是生成字符串。顺便说一句,LocalDate.parse( "2017-01-23").plusWeeks( 1 )
比编写自己的方法更简单,而且更能自我记录。【参考方案8】:
在 Java 8 中,您可以这样做:
Instant inst = Instant.parse("2018-12-30T19:34:50.63Z");
// subtract 10 Days to Instant
Instant value = inst.minus(Period.ofDays(10));
// print result
System.out.println("Instant after subtracting Days: " + value);
【讨论】:
【参考方案9】:您可以使用 SimpleDateFormat 轻松减去日历
public static String subtractDate(String time,int subtractDay) throws ParseException
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);
cal.setTime(sdf.parse(time));
cal.add(Calendar.DATE,-subtractDay);
String wantedDate = sdf.format(cal.getTime());
Log.d("tag",wantedDate);
return wantedDate;
【讨论】:
【参考方案10】:您也可以使用Duration
类。例如
Date currentDate = new Date();
Date oneDayFromCurrentDate = new Date(currentDate.getTime() - Duration.ofDays(1).toMillis());
【讨论】:
【参考方案11】:c1.set(2017, 12 , 01); //Ex: 1999 jan 20 //System.out.println("Date is : " + sdf.format(c1.getTime()));
c1.add(Calendar.MONTH, -2); // substract 1 month
System.out.println
("Date minus 1 month : "
+ sdf.format(c1.getTime()));
【讨论】:
欢迎来到 SO。请不要只回答代码。见***.com/help/how-to-answer。请格式化您的代码。以上是关于如何从 Java 中的 Date 对象中减去 X 天?的主要内容,如果未能解决你的问题,请参考以下文章