为什么在我增加了10分钟之后,月份变成了50?

我有个约会对象:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");
Date d1 = df.parse(interviewList.get(37).getTime());

value of d1 is Fri Jan 07 17:40:00 PKT 2011

Now I am trying to add 10 minutes to the date above.

Calendar cal = Calendar.getInstance();
cal.setTime(d1);
cal.add(Calendar.MINUTE, 10);
String newTime = df.format(cal.getTime());

newTime更改为 2011-50-07 17:50 but it should be 07-01-2011 17:50.

它正确地添加分钟,但它也改变了月份,不知道为什么!

264339 次浏览

对您来说,问题是您正在使用 mm。你应该使用 MMMM表示月份,mm表示分钟。试试 yyyy-MM-dd HH:mm

其他方法:

它可以像这样简单(另一种选择是使用 Joda 时间)

static final long ONE_MINUTE_IN_MILLIS=60000;//millisecs


Calendar date = Calendar.getInstance();
long t= date.getTimeInMillis();
Date afterAddingTenMins=new Date(t + (10 * ONE_MINUTE_IN_MILLIS));

指定错误:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");

您使用的是分钟而不是月份(MM)

您的 SimpleDateFormat 模式中有一个错误

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");

使用这种格式,

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");

mm for minutes and MM for mounth

实现@Pangea 答案的方便方法:

/*
*  Convenience method to add a specified number of minutes to a Date object
*  From: http://stackoverflow.com/questions/9043981/how-to-add-minutes-to-my-date
*  @param  minutes  The number of minutes to add
*  @param  beforeTime  The time that will have minutes added to it
*  @return  A date object with the specified number of minutes added to it
*/
private static Date addMinutesToDate(int minutes, Date beforeTime){
final long ONE_MINUTE_IN_MILLIS = 60000;//millisecs


long curTimeInMs = beforeTime.getTime();
Date afterAddingMins = new Date(curTimeInMs + (minutes * ONE_MINUTE_IN_MILLIS));
return afterAddingMins;
}

可以在 org.apache.comms.lang3.time 包中使用 DateUtils 类

int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute

为我工作吧

//import
import org.apache.commons.lang.time.DateUtils

...

        //Added and removed minutes to increase current range dates
Date horaInicialCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaInicial.getTime()),-1)
Date horaFinalCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaFinal.getTime()),1)

只对感兴趣的人开放。我当时正在做一个 iOS 项目,需要类似的功能,所以我结束了通过@jeznag 将答案移植到 Swift 的工作

private func addMinutesToDate(minutes: Int, beforeDate: NSDate) -> NSDate {
var SIXTY_SECONDS = 60


var m = (Double) (minutes * SIXTY_SECONDS)
var c =  beforeDate.timeIntervalSince1970  + m
var newDate = NSDate(timeIntervalSince1970: c)


return newDate
}

为了避免任何依赖,您可以使用 java.util. Calendar,如下所示:

    Calendar now = Calendar.getInstance();
now.add(Calendar.MINUTE, 10);
Date teenMinutesFromNow = now.getTime();

在 Java8中我们有了新的 API:

    LocalDateTime dateTime = LocalDateTime.now().plus(Duration.of(10, ChronoUnit.MINUTES));
Date tmfn = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());

Once you have you date parsed, I use this utility function to add hours, minutes or seconds:

public class DateTimeUtils {
private static final long ONE_HOUR_IN_MS = 3600000;
private static final long ONE_MIN_IN_MS = 60000;
private static final long ONE_SEC_IN_MS = 1000;


public static Date sumTimeToDate(Date date, int hours, int mins, int secs) {
long hoursToAddInMs = hours * ONE_HOUR_IN_MS;
long minsToAddInMs = mins * ONE_MIN_IN_MS;
long secsToAddInMs = secs * ONE_SEC_IN_MS;
return new Date(date.getTime() + hoursToAddInMs + minsToAddInMs + secsToAddInMs);
}
}

在增加长时间的时候要小心,1天并不总是24小时(夏令时类型的调整,闰秒等等) ,Calendar是为此推荐的。

tl;dr

LocalDateTime.parse(
"2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )

爪哇时间

使用优秀的 java.time 类进行日期时间工作。这些类取代了令人讨厌的旧日期时间类,如 java.util.Datejava.util.Calendar

ISO 8601

Time 类默认使用标准的 ISO 8601格式来解析/生成日期时间值字符串。要使输入字符串符合要求,请将中间的 SPACE 替换为 T

String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );

LocalDateTime

将输入字符串解析为 LocalDateTime,因为它没有任何关于时区或从 UTC 偏移的信息。

LocalDateTime ldt = LocalDateTime.parse( inputModified );

再加十分钟。

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

ToString () : 2016-01-23T12:34

ldtLater.toString(): 2016-01-23T12:44

参见 在 IdeOne.com 上直播代码

LocalDateTime没有时区,所以 没有代表时间线上的一个点。应用一个时区来翻译成一个实际的时刻。指定 continent/region格式的 continent/region0,如 continent/region1、 continent/region2、 Pacific/Aucklandcontinent/region3。永远不要使用3-4个字母的缩写,如 ESTISTPKT,因为它们是 没有真正的时区,不标准化,甚至不唯一(!).

ZonedDateTime

如果您知道此值的预期时区,则应用 ZoneId来获取 ZonedDateTime

ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );

ToString () : 2016-01-23T12:44 + 05:00[ Asia/Karachi ]

异常点

考虑一下是在添加时区之前还是之后添加这十分钟。你可能会得到一个非常不同的结果,因为像夏时制(dST)这样的异常会改变 挂钟时间

您是否应该在添加区域之前或之后添加10分钟,这取决于您的业务场景和规则的含义。

提示: 当你打算在时间线上的一个特定时刻,始终保存时区信息。不要丢失这些信息,就像你的输入数据一样。ABc0的值是巴基斯坦的中午,法国的中午,还是魁北克的中午?如果您指的是巴基斯坦的中午,那么至少要包含从 UTC 偏移的时间(+05:00) ,更好的方法是包含时区的名称(Asia/Karachi)。

Instant

如果你想通过 协调世界时的镜头看到同样的时刻,提取一个 InstantInstant类代表了 协调世界时时间线上的一个时刻,其分辨率为 纳秒(最多为小数部分的9位数)。

Instant instant = zdt.toInstant();

改变信仰

尽可能避免使用麻烦的旧的日期时间类。但如果你必须这么做,你可以改变信仰。调用添加到旧类中的新方法。

java.util.Date utilDate = java.util.Date.from( instant );

关于爪哇时间

爪哇时间框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

The Joda-Time project, now in 维修模式, advises migration to java.time.

要了解更多,请参阅 Oracle 教程。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

从哪里获得 java.time 类?

The 310-号外 project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

可以做到没有常数(如3600000毫秒是1小时)

public static Date addMinutesToDate(Date date, int minutes) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MINUTE, minutes);
return calendar.getTime();
}


public static Date addHoursToDate(Date date, int hours) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.HOUR_OF_DAY, hours);
return calendar.getTime();
}

使用范例:

System.out.println(new Date());
System.out.println(addMinutesToDate(new Date(), 5));


Tue May 26 16:16:14 CEST 2020
Tue May 26 16:21:14 CEST 2020

对于 android 开发人员,这里有一个使用@jeznag 的扩展的 kotlin 实现

 fun Date.addMinutesToDate(minutes: Int): Date {
val minuteMillis: Long = 60000 //millisecs
val curTimeInMs: Long = this.time
val result = Date(curTimeInMs + minutes * minuteMillis)
this.time = result.time
return this
}

检查功能的单元测试按预期工作

@Test
fun `test minutes are added to date`() {
//given
val date = SimpleDateFormat("dd-MM-yyyy hh:mm").parse("29-04-2021 23:00")
//when
date?.addMinutesToDate(45)
//then
val calendar = Calendar.getInstance()
calendar.time = date
assertEquals(29, calendar[Calendar.DAY_OF_MONTH])
assertEquals(23, calendar[Calendar.HOUR_OF_DAY])
assertEquals(45, calendar[Calendar.MINUTE])
}