如何在我的日期添加分钟

时间:2012-01-28 08:41:40

标签: java date calendar simpledateformat java.util.date

我有这个日期对象:

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

d1的值为Fri Jan 07 17:40:00 PKT 2011

现在我想在上面的日期添加10分钟。

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

newTime更改为2011-50-07 17:50的值 但它应该是07-01-2011 17:50

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

13 个答案:

答案 0 :(得分:177)

您遇到的问题是您使用的是mm。您应该使用MMMM代表月份,mm代表分钟。试试yyyy-MM-dd HH:mm

其他方法:

可以这么简单(其他选项是使用joda-time

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

答案 1 :(得分:39)

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

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

答案 2 :(得分:31)

实施@ 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;
}

答案 3 :(得分:16)

这是错误指定的:

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

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

答案 4 :(得分:16)

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

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

在Java 8中,我们有了新的API:

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

答案 5 :(得分:5)

TL;博士

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

java.time

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

ISO 8601

默认情况下,java.time类使用标准ISO 8601格式来解析/生成日期时间值的字符串。要使输入字符串符合要求,请使用T替换中间的空格。

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

LocalDateTime

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

LocalDateTime ldt = LocalDateTime.parse( inputModified );

加10分钟。

LocalDateTime ldtLater = ldt.plusMinutes( 10 );
  

ldt.toString():2016-01-23T12:34

     

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

请参阅live code in IdeOne.com

LocalDateTime没有时区,因此代表时间轴上的一个点。应用时区转换为实际时刻。以continent/region格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/AucklandAsia/Karachi。切勿使用诸如ESTISTPKT之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

ZonedDateTime

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

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

zdt.toString():2016-01-23T12:44 + 05:00 [亚洲/卡拉奇]

异常

考虑是否在添加时区之前或之后添加十分钟。由于诸如夏令时(DST)之类的异常导致wall-clock time移位,您可能会得到截然不同的结果。

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

提示:如果您打算在时间轴上显示特定时刻,始终保留时区信息。与输入数据一样,不要丢失该信息。价值12:34的意思是巴基斯坦的中午或法国的中午或魁北克的中午?如果你的意思是在巴基斯坦的中午,请至少包括从UTC(+05:00)的偏移,更好的是,时区的名称(Asia/Karachi)。

Instant

如果您希望通过UTC的镜头看到相同的时刻,请提取InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = zdt.toInstant();

转换

尽可能避免使用麻烦的旧日期时间类。但如果你必须,你可以转换。调用添加到旧类的新方法。

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

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 6 :(得分:4)

SimpleDateFormat的模式存在错误。它应该是

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

答案 7 :(得分:4)

使用此格式,

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

mm表示分钟,MM表示mounth

答案 8 :(得分:2)

解析完日期后,我会使用此实用程序功能添加小时,分钟或秒:

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

答案 9 :(得分:2)

可以在没有常量的情况下完成(例如3600000 ms是1h)

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

答案 10 :(得分:0)

为我工作DateUtils

//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)

答案 11 :(得分:0)

对于安卓开发者,这里有一个使用@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])
}

答案 12 :(得分:-2)

适合任何有兴趣的人。我正在开发一个需要类似功能的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
}