Как добавить минуты к моей дате
у меня есть этот объект даты:
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 ответов
проблема для вас в том, что вы используете 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");
mm Для минут и MM для mounth
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.классы времени используют standard 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
. The Instant
класс представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дробью).
Instant instant = zdt.toInstant();
преобразование
избегайте проблемных старых классов даты и времени, когда это возможно. Но если нужно, ты можешь обратиться. Вызовите новые методы, добавленные к старым классам.
java.util.Date utilDate = java.util.Date.from( instant );
о java.время
на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
на Joda Времени, теперь режим обслуживания, советует миграцию на java.время.
чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.
где получить java.время занятий?
-
Java SE 8 и SE 9 и позже
- встроенный.
- часть стандартного API Java со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
-
Java SE 6 и SE 7
- большая часть java.функциональность времени обратно портирована на 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
}