Как добавить минуты к моей дате
У меня есть этот объект даты:
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
.
Он добавляет минуты правильно, но также меняет месяц, не знаю почему!
Ответы
Ответ 1
Проблема заключается в том, что вы используете 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));
Ответ 2
Удобный метод для выполнения ответа @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;
}
Ответ 3
вы можете использовать класс DateUtils в пакете org.apache.commons.lang3.time
int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute
Ответ 4
Это неверно указано:
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");
Вы используете минуты вместо месяца (ММ)
Ответ 5
Чтобы избежать любой зависимости, вы можете использовать java.util.Calendar следующим образом:
Calendar now = Calendar.getInstance();
now.add(Calendar.MINUTE, 10);
Date teenMinutesFromNow = now.getTime();
Ответ 6
Ошибка в шаблоне вашего SimpleDateFormat. это должно быть
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Ответ 7
используйте этот формат,
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
мм в минутах и MM для mounth
Ответ 8
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 для синтаксического анализа/генерации строк значений даты и времени. Чтобы ваша строка ввода соответствовала, замените SPACE посередине на 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 );
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 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы даты, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советует перейти на java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация 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
и больше.
Ответ 9
После того, как вы проверили дату, я использую эту функцию утилиты, чтобы добавить часы, минуты или секунды:
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
.
Ответ 10
Работайте со мной 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)
Ответ 11
Просто для всех, кто заинтересован. Я работал над проектом 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
}