【发布时间】:2018-02-06 16:52:27
【问题描述】:
我正在使用这种格式的日期:yyyy-mm-dd。
如何将此日期增加一天?
【问题讨论】:
-
如果您使用的是 Java 8 或更新版本,您可以使用新的日期/时间 API。看到这个答案:stackoverflow.com/a/23910924/1115554
-
new DateTime().plusDays(1).toDate() ???
我正在使用这种格式的日期:yyyy-mm-dd。
如何将此日期增加一天?
【问题讨论】:
在 Kotlin 中,您可以使用这 2 个函数来获取当前日期和未来日期。
fun getCurrentDate(): String {
val currentDate = Calendar.getInstance().time
val dateFormat = SimpleDateFormat("yyyy-dd-MM", Locale.getDefault())
return dateFormat.format(currentDate)
}
fun incrementBy(days: Int): String {
val dateFormat = SimpleDateFormat("yyyy-dd-MM", Locale.getDefault())
val cal = Calendar.getInstance()
cal.time = dateFormat.parse(getCurrentDate())
cal.add(Calendar.DATE, days)
return dateFormat.format(cal.time)
}
调用getCurrentDate(),输出为
2021-26-07
调用incrementBy(3),输出为
2021-29-07
【讨论】:
您只需一行即可完成。
例如增加 5 天
Date newDate = Date.from(Date().toInstant().plus(5, ChronoUnit.DAYS));
减去 5 天
Date newDate = Date.from(Date().toInstant().minus(5, ChronoUnit.DAYS));
【讨论】:
更新(2021 年 5 月):对于旧的、旧的 Java,这是一个非常过时的答案。对于 Java 8 及更高版本,请参阅https://stackoverflow.com/a/20906602/314283
与 C# 相比,Java 似乎远远落后于八球。这个实用方法展示了在 Java SE 6 中使用 Calendar.add method 的方法(可能是唯一简单的方法)。
public class DateUtil
{
public static Date addDays(Date date, int days)
{
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days); //minus number would decrement the days
return cal.getTime();
}
}
要添加一天,根据所提出的问题,将其命名如下:
String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);
【讨论】:
java.util.Date、java.util.Calendar 和 java.text.SimpleDateFormat,现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。
我认为最快的,永远不会被弃用,它是核心
let d=new Date();
d.setTime(d.getTime()+86400000);
console.log(d);
只有一行, 只有 2 个命令。 它适用于日期类型,不使用日历。
我一直认为最好在代码方面使用 unix 时间,并在准备好向用户显示日期时显示日期。
要打印日期 d,我使用
let format1 = new Intl.DateTimeFormat('en', { year: 'numeric', month: 'numeric', month: '2-digit', day: '2-digit'});
let [{ value: month },,{ value: day },,{ value: year }] = format1.formatToParts(d);
它设置 vars 月份和日期,但可以扩展到小时分钟和秒,也可以用于标准 rapresentations,具体取决于国家标志。
【讨论】:
java.util.Date,而问题只要求提供日期,没有时间,也没有时区或偏移量-来自-UTC。或者,您的意思是java.sql.Date,它被设计成一个非常糟糕的黑客,java.util.Date 的一个子类,假装只是一个日期,但实际上有一个时间,这要求我们忽略了它是Date 的子类这一事实。
java.util.Date 和 java.sql.Date,在几年前被 JSR 310 中定义的现代 java.time 类所取代。至于从未被弃用,这些类完全被 java.time 功能所取代,所以我希望有一天它们确实会被弃用。 Sun、Oracle 和 JCP 在采用 JSR 310 后放弃了这些糟糕的日期时间类,我建议我们都这样做。
LocalDate.parse( "2021-01-23" ).plusDays( 1 )。查看正确的Answer by Sobral。
试试这个方法:
public static Date addDay(int day) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DATE, day);
return calendar.getTime();
}
【讨论】:
Calendar 和Date 类设计不佳且过时已久,因此不推荐这种方式。首选LocalDate.now(ZoneId.systemDefault()).plusDays(day)。此外,我看不出你贡献了 Lisa 投票第二高的答案中没有的任何重要内容。
Calendar.DAY_OF_MONTH
对于 Java SE 8 或更高版本,您应该使用新的 Date/Time API
int days = 7;
LocalDate dateRedeemed = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/YYYY");
String newDate = dateRedeemed.plusDays(days).format(formatter);
System.out.println(newDate);
如果您需要将java.util.Date转换为java.time.LocalDate,可以使用此方法。
public LocalDate asLocalDate(Date date) {
Instant instant = date.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
return zdt.toLocalDate();
}
对于 Java SE 8 之前的版本,您可以使用 Joda-Time
Joda-Time 提供了 Java 日期和时间的优质替代品 类,是 Java 的事实上的标准日期和时间库 在 Java SE 8 之前
int days = 7;
DateTime dateRedeemed = DateTime.now();
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/uuuu");
String newDate = dateRedeemed.plusDays(days).toString(formatter);
System.out.println(newDate);
【讨论】:
其实很简单。
一天包含 86400000 毫秒。
因此,首先您使用System.currentTimeMillis() 从系统中获取当前时间(以毫秒为单位),然后
添加 84000000 毫秒并使用 Date 类生成毫秒的日期格式。
例子
String Today = new Date(System.currentTimeMillis()).toString();
String 今天是 2019-05-9
String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();
字符串明天将是 2019-05-10
String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();
字符串 DayAfterTommorow 将是 2019-05-11
【讨论】:
Date 类,它在几年前被现代的java.time 类所取代。简单易用:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender
【讨论】:
Calendar 类。
Calendar.DAY_OF_MONTH
看看 Joda-Time (https://www.joda.org/joda-time/)。
DateTimeFormatter parser = ISODateTimeFormat.date();
DateTime date = parser.parseDateTime(dateString);
String nextDay = parser.print(date.plusDays(1));
【讨论】:
让我们澄清一下用例:您想要进行日历算术并以java.util.Date 开始/结束。
一些方法:
考虑使用java.time.Instant:
Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);
【讨论】:
Date)与现代的 java.time 类(如 Instant)混用。 java.time 类完全取代了遗留类。具体来说,Instant 替换了java.util.Date。
在 Java 8 中简单的做法是:
Date.from(Instant.now().plusSeconds(SECONDS_PER_DAY))
【讨论】:
Instant.now().plus( 1 , ChronoUnit.DAYS )?
这很简单,试着用一个简单的词来解释。 获取今天的日期如下
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE, 1);
现在通过使用(常量,值)的 calendar.add 方法将此日期提前一天。这里的常量可以是 DATE、小时、分钟、秒等,而 value 是常量的值。就像一天一样,提前常量是 Calendar.DATE,它的值为 1,因为我们想要提前一天的值。
System.out.println(calendar.getTime());// print modified date which is明天的日期
谢谢
【讨论】:
Calendar.DAY_OF_MONTH
您可以使用“org.apache.commons.lang3.time”中的这个包:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date myNewDate = DateUtils.addDays(myDate, 4);
Date yesterday = DateUtils.addDays(myDate, -1);
String formatedDate = sdf.format(myNewDate);
【讨论】:
Date 班级是个糟糕的建议。麻烦的旧日期时间类,例如 java.util.Date、java.util.Calendar 和 java.text.SimpleDateFormat,现在是 legacy,被 Java 8 和 Java 9 中内置的 java.time 类所取代。请参阅 Tutorial by Oracle。使用LocalDate 类查看其他答案。
SimpleDateFormat 类不幸地注入了一个时区,隐式地应用了 JVM 当前的默认时区。因此,无论当前默认值是什么,这段代码的结果都会有所不同——并且该默认值可以在运行时期间随时更改。
如果您使用的是 Java 8,那么就这样做吧。
LocalDate sourceDate = LocalDate.of(2017, Month.MAY, 27); // Source Date
LocalDate destDate = sourceDate.plusDays(1); // Adding a day to source date.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // Setting date format
String destDate = destDate.format(formatter)); // End date
如果你想使用 SimpleDateFormat,那么就这样做吧。
String sourceDate = "2017-05-27"; // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse(sourceDate)); // parsed date and setting to calendar
calendar.add(Calendar.DATE, 1); // number of days to add
String destDate = sdf.format(calendar.getTime()); // End date
【讨论】:
LocalDate 类而不是LocalDateTime。
Date today = new Date();
SimpleDateFormat formattedDate = new SimpleDateFormat("yyyyMMdd");
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, 1); // number of days to add
String tomorrow = (String)(formattedDate.format(c.getTime()));
System.out.println("Tomorrows date is " + tomorrow);
这将给出明天的日期。 c.add(...) 参数可以从 1 更改为另一个数字以获得适当的增量。
【讨论】:
Date 或Calendar。
因为 Java 1.5 TimeUnit.DAYS.toMillis(1) 在我看来更干净。
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Date day = dateFormat.parse(string);
// add the day
Date dayAfter = new Date(day.getTime() + TimeUnit.DAYS.toMillis(1));
【讨论】:
LocalDate 类,以及在 ThreeTen-Backport 项目中找到的 Java 6 和 Java 7 的反向移植。
Java 8 添加了一个用于处理日期和时间的新 API。
使用 Java 8,您可以使用以下代码行:
// parse date from yyyy-mm-dd pattern
LocalDate januaryFirst = LocalDate.parse("2014-01-01");
// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);
【讨论】:
januaryFirst.plusDays(1)而不是date.plusDays(1)。
如果您使用的是 Java 8,java.time.LocalDate 和 java.time.format.DateTimeFormatter 可以使这项工作变得非常简单。
public String nextDate(String date){
LocalDate parsedDate = LocalDate.parse(date);
LocalDate addedDate = parsedDate.plusDays(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-mm-dd");
return addedDate.format(formatter);
}
【讨论】:
toString() 生成字符串 i yyyy-MM-dd 格式(如果您坚持,请记住 mm 是分钟,而 MM 是月)。
在 java 8 中你可以使用java.time.LocalDate
LocalDate parsedDate = LocalDate.parse("2015-10-30"); //Parse date from String
LocalDate addedDate = parsedDate.plusDays(1); //Add one to the day field
你可以转换成java.util.Date对象如下。
Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
您可以将LocalDate 格式化为字符串,如下所示。
String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
【讨论】:
在 Java 8 及更高版本上,java.time package 使这几乎是自动化的。 (Tutorial)
假设String输入输出:
import java.time.LocalDate;
public class DateIncrementer {
static public String addOneDay(String date) {
return LocalDate.parse(date).plusDays(1).toString();
}
}
【讨论】:
ZonedDateDateTime 和 OffsetDateTime 也有 plusDays 和 minusDays 方法以及 LocalDate
LocalDate 的信息。
你可以使用简单的 java.util 库
Calendar cal = Calendar.getInstance();
cal.setTime(yourDate);
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();
【讨论】:
java.util.Date、java.util.Calendar 和 java.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。
如果您想添加单个时间单位,并且希望其他字段也增加,您可以安全地使用 add 方法。请参见下面的示例:
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.set(1970,Calendar.DECEMBER,31);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, 1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, -1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
将打印:
1970-12-31
1971-01-01
1970-12-31
【讨论】:
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);
这需要从 oldDate 开始的毫秒数并添加 1 天的毫秒数,然后使用 Date() 公共构造函数使用新值创建日期。此方法允许您添加 1 天或任意数量的小时/分钟,而不仅仅是一整天。
【讨论】:
只需在字符串中传递日期和接下来的天数
private String getNextDate(String givenDate,int noOfDays) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
String nextDaysDate = null;
try {
cal.setTime(dateFormat.parse(givenDate));
cal.add(Calendar.DATE, noOfDays);
nextDaysDate = dateFormat.format(cal.getTime());
} catch (ParseException ex) {
Logger.getLogger(GR_TravelRepublic.class.getName()).log(Level.SEVERE, null, ex);
}finally{
dateFormat = null;
cal = null;
}
return nextDaysDate;
}
【讨论】:
我更喜欢使用来自 Apache 的 DateUtils。检查此http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html。它很方便,尤其是当您必须在项目中的多个位置使用它并且不想为此编写一个衬垫方法时。
API 说:
addDays(Date date, int amount) :将天数添加到返回新对象的日期。
请注意,它返回一个新的 Date 对象,并且不会对前一个对象本身进行更改。
【讨论】:
Apache Commons 已经有这个 DateUtils.addDays(Date date, int amount) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addDays%28java.util.Date,%20int%29 供您使用,或者您可以使用 JodaTime 以使其更清洁。
【讨论】:
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);
【讨论】:
Sun Apr 30 16:25:33 CEST 2017 之后是Mon May 01 16:25:33 CEST 2017。不过,这仍然是一个不鼓励的解决方案。不仅该方法被弃用是有充分理由的,而且在 2017 年,我们有很好的替代 Date 类的方法。
请注意,此行增加了 24 小时:
d1.getTime() + 1 * 24 * 60 * 60 * 1000
但是这一行增加了一天
cal.add( Calendar.DATE, 1 );
在夏令时更改(25 或 23 小时)的日子里,您会得到不同的结果!
【讨论】:
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );
【讨论】:
这样的事情应该可以解决问题:
String dt = "2008-01-01"; // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE, 1); // number of days to add
dt = sdf.format(c.getTime()); // dt is now the new date
【讨论】:
add() 将滚动日期。请参阅ideone。
java.util.Date、java.util.Calendar 和 java.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。