Як додати хвилини до моєї дати


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.

Він додає хвилини правильно, але він також змінюється місяць, не знаю чому!



Відповіді:


193

Проблема для вас полягає в тому, що ви використовуєте mm. Ви повинні використовувати MM. MMє за місяць і 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));

дякую, я спробував це, дата настає правильно, але коли я намагаюся змінити її як рядок, це дає мені такий же неправильний результат String newTime = df.format (afterAddingTenMins); це дає мені 2011-50-07 17:50, я повинен перетворити його в String, будь-яка пропозиція
junaidp

1
@junaidp Ви використовували останній біт коду, але ігнорували попередню частину рішення?
Карл

57

ви можете використовувати клас DateUtils в пакеті org.apache.commons.lang3.time

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

1
Для людей, які мають справу зі старішою версією DateUtils, її присутнім у пакеті ->org.apache.commons.lang.time.DateUtils
realPK

32

Зручний спосіб реалізації відповіді @ Пангеї:

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

25

Щоб уникнути будь-якої залежності, ви можете використовувати 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");

Ви використовуєте хвилини замість місяця (ММ)


6

тл; д-р

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

java.time

Використовуйте чудові класи java.time для роботи в режимі побачень. Ці класи витісняють тривожні старі класи, такі як java.util.Dateі java.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 );

Додайте десять хвилин.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

Дивіться прямий код на IdeOne.com .

У LocalDateTimeнього немає часового поясу, тому він не представляє крапки на часовій шкалі. Застосовуйте часовий пояс для перекладу на фактичний момент. Вкажіть правильний час ім'я зони в форматі continent/region, наприклад America/Montreal, Africa/Casablancaабо Pacific/Auckland, або Asia/Karachi. Ніколи не використовуйте 3-4 лист абревіатури , такі як ESTабо ISTчи PKTяк вони НЕ справжні часові пояси, не стандартизований, і навіть не єдиний (!).

ZonedDateTime

Якщо ви знаєте призначений часовий пояс для цього значення, застосуйте a, 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.Date, Calendar, і SimpleDateFormat.

Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти на java.time.

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .

Де отримати класи java.time?

  • Java SE 8 та SE 9 та новіші версії
    • Вбудований.
    • Частина стандартного Java API з пакетною реалізацією.
    • Java 9 додає деякі незначні функції та виправлення.
  • Java SE 6 і SE 7
    • Значна частина функцій java.time повертається до Java 6 і 7 у ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


4

У шаблоні вашого SimpleDateFormat є помилка. вона повинна бути

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

4

використовувати цей формат,

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

мм для хвилин і ММ для кріплення


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рекомендується для цього.


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 мс - це 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

1
Ці страшні заняття з датою часу були витіснені роками тому сучасними класами java.time станом на прийняття JSR 310.
Василь Бурк

-2

Просто для кожного, хто цікавиться. Я працював над проектом iOS, який вимагав подібної функціональності, тому я закінчив пересилати відповідь від @jeznag до швидкої роботи

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 (timeInterval:, since:)
Альберт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.