Как добавить минуты к моему свиданию

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-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 newTime = df.format (afterAddingTenMins); это дает мне 2011-50-07 17:50, я должен преобразовать его в String, любое предложение
junaidp
1
@junaidp вы использовали последний фрагмент кода, но проигнорировали первую часть решения?
Carl
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

Метод удобства для реализации ответа @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
источник
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");

Вы используете минуты вместо месяца (ММ)

Dawood
источник
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.Dateи java.util.Calendar.

ISO 8601

Классы java.time по умолчанию используют стандартные форматы ISO 8601 для синтаксического анализа / генерации строк значений даты и времени. Чтобы ваша входная строка соответствовала требованиям, замените ПРОБЕЛ посередине на T.

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

LocalDateTime

Разберите входную строку как a, 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

Если вы знаете предполагаемый часовой пояс для этого значения, примените, 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означает: полдень в Пакистане, полдень во Франции или полдень в Квебеке? Если вы имели в виду полдень в Пакистане, скажите об этом, включив хотя бы offset-from-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 Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - 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);
    }
}

Будьте осторожны при добавлении длительных периодов времени, Calendarдля этого рекомендуется 1 день не всегда 24 часа (корректировки типа летнего времени, дополнительные секунды и т. Д.) .

Дэвид Мигель
источник
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 ? Кроме того, вопрос касается минут, а не секунд.
Basil Bourque
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
}
Таухид
источник
Date из Swift уже имеет аналогичную встроенную функцию, например Date (timeInterval:, Since:)
Альберт