Jak dodać minuty do mojej randki

110

Mam ten obiekt daty:

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

wartość d1 wynosi Fri Jan 07 17:40:00 PKT 2011

Teraz staram się dodać 10 minut do powyższej daty.

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

Wartość newTimezmian, 2011-50-07 17:50 ale powinna być 07-01-2011 17:50.

Dodaje minuty poprawnie, ale zmienia też miesiąc, nie wiem dlaczego!

junaidp
źródło

Odpowiedzi:

193

Problem polega na tym, że używasz mm. Powinieneś użyć MM. MMdotyczy miesiąca i mmminut. Spróbuj zyyyy-MM-dd HH:mm

Inne podejście:

To może być tak proste, jak to (inną opcją jest użycie czasu 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));
Aravind Yarram
źródło
dzięki, próbowałem tego, data nadchodzi poprawnie, ale kiedy próbuję zmienić ją na ciąg, daje mi ten sam zły wynik String newTime = df.format (afterAddingTenMins); to daje mi 2011-50-07 17:50, muszę przekonwertować go na String, wszelkie sugestie
junaidp
1
@junaidp Użyłeś drugiego fragmentu kodu, ale zignorowałeś poprzednią część rozwiązania?
Carl
57

możesz użyć klasy DateUtils w pakiecie org.apache.commons.lang3.time

int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute
Alireza Alallah
źródło
1
Dla osób zajmujących się starszą wersją DateUtils, jest obecny w pakiecie ->org.apache.commons.lang.time.DateUtils
realPK
32

Wygodna metoda implementacji odpowiedzi @ 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;
}
jeznag
źródło
26

Aby uniknąć zależności, możesz użyć java.util.Calendar w następujący sposób:

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

W Javie 8 mamy nowe API:

    LocalDateTime dateTime = LocalDateTime.now().plus(Duration.of(10, ChronoUnit.MINUTES));
    Date tmfn = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
Marco Montel
źródło
17

To jest niepoprawnie określone:

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

Używasz minut zamiast miesiąca (MM)

Dawood
źródło
6

tl; dr

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

java.time

Użyj doskonałych klas java.time do pracy z datą i godziną. Te klasy zastępują kłopotliwe stare klasy daty i godziny, takie jak java.util.Datei java.util.Calendar.

ISO 8601

Klasy java.time używają domyślnie standardowych formatów ISO 8601 do analizowania / generowania ciągów wartości daty i godziny. Aby Twój ciąg wejściowy był zgodny, zamień SPACJĘ w środku na T.

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

LocalDateTime

Przeanalizuj ciąg wejściowy jako ciąg, ponieważ LocalDateTimenie ma żadnych informacji o strefie czasowej lub przesunięciu od czasu UTC.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Dodaj dziesięć minut.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

Zobacz kod na żywo w IdeOne.com .

To LocalDateTimenie ma strefy czasowej, więc nie reprezentuje punktu na osi czasu. Zastosuj strefę czasową, aby przetłumaczyć na aktualny moment. Określ prawidłową nazwę strefy czasowej w formacie continent/region, takie jak America/Montreal, Africa/Casablancaalbo Pacific/Auckland, albo Asia/Karachi. Nigdy nie używaj 3-4-literowego skrótu, takiego jak ESTlub ISTlub, PKTponieważ nie są to prawdziwe strefy czasowe, nie znormalizowane, a nawet nie unikalne (!).

ZonedDateTime

Jeśli znasz docelową strefę czasową dla tej wartości, zastosuj a, ZoneIdaby uzyskać ZonedDateTime.

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

zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Azja / Karaczi]

Anomalie

Zastanów się, czy dodać te dziesięć minut przed czy po dodaniu strefy czasowej. Możesz otrzymać zupełnie inny wynik z powodu anomalii, takich jak czas letni (DST), który przesuwa czas zegara ściennego .

To, czy należy dodać 10 minut przed, czy po dodaniu strefy, zależy od znaczenia scenariusza biznesowego i reguł.

Porada: Jeśli zamierzasz określić konkretny moment na osi czasu, zawsze przechowuj informacje o strefie czasowej . Nie trać tych informacji, tak jak to się dzieje z danymi wejściowymi. Czy wartość 12:34ma być południem w Pakistanie, południem we Francji lub południem w Quebecu? Jeśli masz na myśli południe w Pakistanie, powiedz to, dodając przynajmniej przesunięcie-od-UTC ( +05:00), a jeszcze lepiej, nazwę strefy czasowej ( Asia/Karachi).

Instant

Jeśli chcesz mieć ten sam moment, który widzisz przez soczewkę UTC , wyodrębnij plik Instant. InstantKlasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).

Instant instant = zdt.toInstant();

Konwertować

O ile to możliwe, unikaj kłopotliwych starych klas daty i godziny. Ale jeśli musisz, możesz się nawrócić. Wywołaj nowe metody dodane do starych klas.

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

Informacje o java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, i SimpleDateFormat.

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do java.time.

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Skąd wziąć klasy java.time?

  • Java SE 8 i SE 9 i nowsze
    • Wbudowany.
    • Część standardowego interfejsu API języka Java z dołączoną implementacją.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 i SE 7
    • Wiele funkcji java.time jest przenoszonych z powrotem do Java 6 i 7 w ThreeTen-Backport .
  • Android

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .

Basil Bourque
źródło
4

We wzorcu Twojego SimpleDateFormat występuje błąd. powinno być

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Baldrick
źródło
4

użyj tego formatu,

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

mm dla minut i MM dla mies

Kushan
źródło
2

Po przeanalizowaniu daty używam tej funkcji narzędzia, aby dodać godziny, minuty lub sekundy:

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

Zachowaj ostrożność przy dodawaniu długich okresów, 1 dzień nie zawsze jest 24 godziną (korekty typu czasu letniego, sekundy przestępne itp.), W Calendartym celu zaleca się.

David Miguel
źródło
1

Pracuj dla mnie 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)
Samuel Ivan
źródło
2
W jaki sposób ta odpowiedź poprawia się w porównaniu z tą z zeszłego roku opublikowaną przez alireza alallah ? Pytanie dotyczyło również minut, a nie sekund.
Basil Bourque
1

Można to zrobić bez stałych (np. 3600000 ms to 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();
}

przykład użycia:

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
Marek Manduch
źródło
1
Te okropne klasy data-czas zostały wyparte lata temu przez nowoczesne klasy java.time , od przyjęcia JSR 310.
Basil Bourque
-2

Tylko dla każdego, kto jest zainteresowany. Pracowałem nad projektem iOS, który wymagał podobnej funkcjonalności, więc zakończyłem przenoszenie odpowiedzi z @jeznag na 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
}
tawheed
źródło
Date ze Swift miał już podobną wbudowaną funkcję, na przykład Date (timeInterval:, od:)
Albert