如何在我的约会中添加分钟


110

我有这个日期对象:

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

它可以正确地增加分钟,但它也会更改月份,不知道为什么!



Answers:


193

您遇到的问题是您正在使用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));

谢谢,我试过了,日期正确了,但是当我尝试将其更改为string时,它给了我同样错误的结果。它给了我2011-50-07 17:50,我不得不将它转换为String,有任何建议
junaidp 2012年

1
@junaidp您使用了后面的代码,但是忽略了解决方案的前一部分?
卡尔

57

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

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

1
对于使用较旧版本的DateUtils的人们,其当前包装为->org.apache.commons.lang.time.DateUtils
realPK '17

32

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

26

为了避免任何依赖性,可以按如下方式使用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());

17

指定错误:

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

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


6

tl; dr

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格式来解析/生成日期时间值的字符串。为了使您的输入字符串符合要求,请将中间的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 );

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

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

请参阅IdeOne.com中的实时代码

LocalDateTime有没有时区,所以它并不能代表在时间轴上的一个点。应用时区以转换为实际时刻。指定适当的时区名称,格式continent/region,如America/MontrealAfrica/CasablancaPacific/Auckland,或Asia/Karachi。切勿使用3-4个字母的缩写,如ESTISTPKT因为他们没有真正的时区,不规范,甚至不是唯一的(!)。

ZonedDateTime

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

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

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

异常现象

考虑在添加时区之前还是之后的十分钟添加这些时间。由于诸如夏令时(DST)之类的异常会改变挂钟时间,您可能会得到截然不同的结果。

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

提示:如果您打算在时间线上指定某个时刻,请务必保留时区信息。不要像输入数据一样丢失该信息。该值12:34是要在巴基斯坦中午,在法国中午还是在魁北克中午?如果您是在巴基斯坦中午表示,请至少包含UTC偏移量(+05:00),最好还包括时区的名称(Asia/Karachi)。

Instant

如果您希望通过UTC镜头看到相同的瞬间,请提取一个Instant。该Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。

Instant instant = zdt.toInstant();

兑换

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

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

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


4

您的SimpleDateFormat的模式有误。它应该是

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

4

使用这种格式,

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

mm为分钟,MM为mounth


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小时(夏令时调整,leap秒等等),请Calendar注意这一点。


1

为我工作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)

2
这个答案与alireza alallah去年发布的答案相比有何改进?另外,问题是指分钟,而不是秒。
罗勒·布尔克

1

无需常量即可完成(例如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

1
这些可怕的日期时间类被取代年前由现代java.time类,通过JSR 310的
罗勒布尔克

-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
}

Swift中的Date已经具有类似的内置函数,例如Date(timeInterval:,since:)
艾伯特(Albert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.