Как добавить минуты к моему свиданию
У меня есть этот объект даты:
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.
Он добавляет минуты правильно, но он также меняет месяц, не знаю почему!
11 ответов:
Проблема для вас заключается в том, что вы используете
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));
Вы можете использовать класс 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 есть ошибка. это должно быть
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Используйте этот формат,
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");Мм Для минут и мм для маунта
Tl; dr
[36]}Java.времяLocalDateTime.parse( "2016-01-23 12:34".replace( " " , "T" ) ) .atZone( ZoneId.of( "Asia/Karachi" ) ) .plusMinutes( 10 )Используйте отличную java.временные классы для работы в режиме "дата-время". Эти классы вытесняют беспокойные старые классы даты и времени, такие как
java.util.Dateиjava.util.Calendar.ISO 8601
Ява.классы времени используют стандартные форматы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
Лдтлатер.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, чтобы получить aZonedDateTime.ZoneId z = ZoneId.of( "Asia/Karachi" ); ZonedDateTime zdt = ldt.atZone( z );ЗДТ.toString(): 2016-01-23T12: 44+05: 00 [Азия/Карачи]
Аномалии
Подумайте, добавить ли эти десять минут до или после добавления часового пояса. Вы можете получить совсем другой результат из-за аномалий, таких как летнее время (DST), которые сдвигают время настенных часов.Следует ли добавлять 10 минут до или после добавления зоны, зависит от смысла вашего бизнес-сценария и правил.
Совет: когда вы планируете конкретный момент на timeline, всегда храните информацию о часовом поясе . Не теряйте эту информацию, как это делается с вашими входными данными. Означает ли значение
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 );
О Яве.время
The java.фреймворк time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые унаследованные классы даты и времени, такие как
java.util.Date,Calendar, &SimpleDateFormat.ПроектJoda-Time , теперь находящийся в режимеобслуживания , советует перейти на java.время.
Чтобы узнать больше, смотрите учебник Oracle. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
Где получить java.время занятий?
- Java SE 8 и еще SE 9 а потом ...
- встроенный.
- часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и еще SE 7
- большая часть java.функциональность time обратно портирована на Java 6 и 7 в ThreeTen-Backport.
- Android
- ThreeTenABP проект адаптируется 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 }
Comments