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


у меня есть этот объект даты:

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 но он должен быть!--5-->.

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

11 82

11 ответов:

вопрос для вас заключается в том, что вы используете 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));

вы можете использовать класс DateUtils в org.апаш.палата общин.lang3.пакет времени

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

удобный способ реализации ответа @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;
}

Это неверно указаны:

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

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

во избежание любой зависимости вы можете использовать java.утиль.Календарь следующим образом:

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

в шаблоне вашего SimpleDateFormat есть ошибка. он должен быть!--2-->

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

используйте этот формат,

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

мм мин и ММ за месяц

tl; dr

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

java.время

используйте отличную java.классы времени для работы с датой и временем. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date и java.util.Calendar.

ISO 8601

java.классы времени используют стандарт 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

если вы знаете предполагаемый часовой пояс для этого значения, примените ZoneId и ZonedDateTime.

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

нмв.метод 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.время

The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date, Calendar,& SimpleDateFormat.

The Joda-Time, теперь режим обслуживания, советует миграцию на java.время.

чтобы узнать больше, смотрите Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.

где получить java.время занятий?

  • Java SE 8 и SE 9 и позже
    • встроенный.
    • часть стандартного Java API с комплектной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • большая часть java.функциональность время портированы с Java 6 и 7 в ThreeTen-Backport.
  • Android

в ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как Interval,YearWeek,YearQuarter и больше.

после того, как вы проанализировали дату, я использую эту функцию утилиты для добавления часов, минут или секунд:

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

Работа для меня 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)

только для тех, кто заинтересован. Я работал над проектом 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
}