Tarihime dakika nasıl eklenir


110

Şu tarih nesnesine sahibim:

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

d1'in değeri Fri Jan 07 17:40:00 PKT 2011

Şimdi yukarıdaki tarihe 10 dakika eklemeye çalışıyorum.

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

newTimeDeğişimin değeri 2011-50-07 17:50 ama olmalı 07-01-2011 17:50.

Dakikaları doğru bir şekilde ekler ama ay da değişir, nedenini bilmiyorum!



Yanıtlar:


193

Senin için sorun, kullanıyor olman mm. Kullanmalısınız MM. MMay içindir ve mmdakikalar içindir. İle deneyinyyyy-MM-dd HH:mm

Diğer yaklaşım:

Bu kadar basit olabilir (diğer seçenek joda-time kullanmaktır )

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

teşekkürler, bunu denedim, tarih doğru geliyor, ama onu string olarak değiştirmeye çalıştığımda bana aynı yanlış sonucu veriyor. String newTime = df.format (afterAddingTenMins); bana 2011-50-07 17:50 veriyor, bunu String'e dönüştürmem gerekiyor, herhangi bir öneri
junaidp

1
@junaidp kodun son kısmını kullandınız, ancak çözümün önceki kısmını görmezden geldiniz?
Carl

57

DateUtils sınıfını org.apache.commons.lang3.time paketinde kullanabilirsiniz

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

1
DateUtils'in eski sürümüyle uğraşan kişiler için, pakette mevcut ->org.apache.commons.lang.time.DateUtils
realPK

32

@ Pangaea'nın cevabını uygulamak için uygun yöntem:

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

Herhangi bir bağımlılıktan kaçınmak için java.util.Calendar'ı aşağıdaki gibi kullanabilirsiniz:

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

Java 8'de yeni API'miz var:

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

17

Bu yanlış belirtilmiştir:

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

Ay yerine dakika kullanıyorsunuz (MM)


6

tl; dr

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

java.time

Tarih-saat çalışması için mükemmel java.time sınıflarını kullanın. Bu sınıflar, java.util.Dateve gibi zahmetli eski tarih-saat sınıflarının yerini alır java.util.Calendar.

ISO 8601

Java.time sınıfları , tarih-saat değerlerinin dizelerini ayrıştırmak / oluşturmak için varsayılan olarak standart ISO 8601 biçimlerini kullanır . Giriş dizenizin uyumlu olmasını sağlamak için ortadaki SPACE'i bir T.

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

LocalDateTime

Giriş dizenizi LocalDateTimesaat dilimi veya UTC'den sapma hakkında herhangi bir bilgi olmadığı için ayrıştırın .

LocalDateTime ldt = LocalDateTime.parse( inputModified );

On dakika ekleyin.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

IdeOne.com'da canlı koda bakın .

Yani LocalDateTimeo bu yüzden, hiçbir zaman dilimini sahip olmayan zaman çizelgesi üzerinde bir noktayı temsil eder. Gerçek bir ana çevirmek için bir saat dilimi uygulayın. Bir belirtme uygun bir zaman dilimi adı biçiminde continent/regiongibi America/Montreal, Africa/Casablancaya da Pacific/Auckland, ya da Asia/Karachi. 3-4 harfli bir kısaltma kullanmayın gibi ESTya ISTya PKToldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).

ZonedDateTime

Bu değer için amaçlanan saat dilimini biliyorsanız, a ZoneIdalmak için a uygulayın ZonedDateTime.

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

zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Asya / Karaçi]

Anormallikler

Bir saat dilimi eklemeden önce mi sonra mı ekleyeceğinizi düşünün. Duvar saati zamanını değiştiren Yaz Saati Uygulaması (DST) gibi anormallikler nedeniyle çok farklı bir sonuç alabilirsiniz .

Bölge eklemeden önce veya sonra 10 dakika eklemeniz gerekip gerekmediği, iş senaryonuzun ve kurallarınızın anlamına bağlıdır.

İpucu: Zaman çizelgesinde belirli bir ana niyet ettiğinizde, her zaman saat dilimi bilgilerini saklayın . Giriş verilerinizde olduğu gibi bu bilgileri kaybetmeyin. Değer 12:34Pakistan'da öğlen mi, Fransa'da öğlen mi yoksa Québec'te öğlen mi? Pakistan'da öğle +05:00saatini kastettiyseniz, bunu en azından UTC'den uzaklığı ( ) ve daha da iyisi saat diliminin adını ( ) ekleyerek söyleyin Asia/Karachi.

Instant

UTC'nin merceğinden görülenle aynı anı istiyorsanız, bir Instant. InstantSınıfı zaman çizelgesinde bir anı temsil UTC çözünürlüğe sahip nanosaniye (ondalık kesir dokuz (9) haneye kadar).

Instant instant = zdt.toInstant();

Dönüştürmek

Mümkün olduğunca eski tarih-saat sınıflarından kaçının. Ama mecbur kalırsan, dönüştürebilirsin. Eski sınıflara eklenen yeni yöntemleri çağırın.

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

Java.time hakkında

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Şu anda bakım modunda olan Joda-Time projesi, java.time'a geçişi tavsiye ediyor.

Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Java.time sınıflarını nereden edinebilirim?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


4

SimpleDateFormat'ınızın deseninde bir hata var. olmalı

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

4

bu biçimi kullanın,

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

dakika için mm ve ay için MM


2

Tarihi ayrıştırdıktan sonra, saat, dakika veya saniye eklemek için bu yardımcı program işlevini kullanıyorum:

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

Uzun süre eklerken dikkatli olun, 1 gün her zaman 24 saat değildir (gün ışığından yararlanma türü ayarlamalar, artık saniyeler vb.), Bunun Calendariçin önerilir.


1

Benim için çalış 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
Bu Cevap , alireza alallah'ın geçen yıl gönderdiği yanıtta nasıl gelişecek ? Ayrıca, Soru saniyelerle değil, dakikalarla ilgilidir.
Basil Bourque

1

Sabitler olmadan yapılabilir (3600000 ms, 1 saat gibi)

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

kullanım örneği:

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
Bu korkunç tarih-zaman sınıfları , JSR 310'un benimsenmesiyle, yıllar önce modern java.time sınıfları tarafından değiştirildi.
Basil Bourque

-2

Sadece ilgilenen herkes için. Benzer işlevsellik gerektiren bir iOS projesi üzerinde çalışıyordum, bu yüzden cevabı @jeznag tarafından hızlı bir şekilde taşımayı bitirdim

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'in tarihi zaten benzer bir yerleşik işleve sahipti, örneğin Date (timeInterval:, çünkü:)
Albert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.