Android получит дату раньше, чем за 7 дней (одну неделю)
Как получить дату до истечения одной недели в Android в этом формате:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
пример: сейчас 2010-09-19 HH:mm:ss
, раньше, чем за неделю 2010-09-12 HH:mm:ss
Спасибо
Переведено автоматически
Ответ 1
Анализирует дату:
Date myDate = dateFormat.parse(dateString);
А затем либо выясните, сколько миллисекунд вам нужно вычесть:
Date newDate = new Date(myDate.getTime() - 604800000L); // 7 * 24 * 60 * 60 * 1000
Или используйте API, предоставляемый классом java.util.Calendar
:
Calendar calendar = Calendar.getInstance();
calendar.setTime(myDate);
calendar.add(Calendar.DAY_OF_YEAR, -7);
Date newDate = calendar.getTime();
Затем, если вам нужно, преобразуйте ее обратно в строку:
String date = dateFormat.format(newDate);
Ответ 2
Я создал свою собственную функцию, которая может быть полезна для получения следующей / предыдущей даты из
Текущая дата:
/**
* Pass your date format and no of days for minus from current
* If you want to get previous date then pass days with minus sign
* else you can pass as it is for next date
* @param dateFormat
* @param days
* @return Calculated Date
*/
public static String getCalculatedDate(String dateFormat, int days) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(dateFormat);
cal.add(Calendar.DAY_OF_YEAR, days);
return s.format(new Date(cal.getTimeInMillis()));
}
Пример:
getCalculatedDate("dd-MM-yyyy", -10); // It will gives you date before 10 days from current date
getCalculatedDate("dd-MM-yyyy", 10); // It will gives you date after 10 days from current date
и если вы хотите получить расчетную дату с передачей вашей собственной даты:
public static String getCalculatedDate(String date, String dateFormat, int days) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(dateFormat);
cal.add(Calendar.DAY_OF_YEAR, days);
try {
return s.format(new Date(s.parse(date).getTime()));
} catch (ParseException e) {
// TODO Auto-generated catch block
Log.e("TAG", "Error in Parsing Date : " + e.getMessage());
}
return null;
}
Пример с передачей собственной даты:
getCalculatedDate("01-01-2015", "dd-MM-yyyy", -10); // It will gives you date before 10 days from given date
getCalculatedDate("01-01-2015", "dd-MM-yyyy", 10); // It will gives you date after 10 days from given date
Ответ 3
tl; dr
LocalDate
.now( ZoneId.of( "Pacific/Auckland" ) ) // Get the date-only value for the current moment in a specified time zone.
.minusWeeks( 1 ) // Go back in time one week.
.atStartOfDay( ZoneId.of( "Pacific/Auckland" ) ) // Determine the first moment of the day for that date in the specified time zone.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a string in standard ISO 8601 format.
.replace( "T" , " " ) // Replace the standard "T" separating date portion from time-of-day portion with a SPACE character.
java.time
Современный подход использует классы java.time.
Класс LocalDate
представляет значение только для даты без указания времени суток и часового пояса.
Часовой пояс имеет решающее значение для определения даты. Для любого данного момента дата варьируется по всему миру в зависимости от зоны. Например, через несколько минут после полуночи в Париже, Франция, наступает новый день, в то время как в Монреале Квебек все еще “вчера”.
Укажите правильное название часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 3-4-буквенные сокращения, такие как EST
или IST
, поскольку они не соответствуют истинным часовым поясам, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.forID( "America/Montreal" ) ;
LocalDate now = LocalDate.now ( z ) ;
Произведите некоторые вычисления, используя методы minus…
и plus…
.
LocalDate weekAgo = now.minusWeeks( 1 );
Позвольте java.time определять начало дня для желаемого часового пояса. Не предполагайте, что день начинается с 00:00:00
. Аномалии, такие как переход на летнее время, означают, что день может начаться в другое время суток, например 01:00:00
.
ZonedDateTime weekAgoStart = weekAgo.atStartOfDay( z ) ;
Создайте строку, представляющую этот ZonedDateTime
объект, используя DateTimeFormatter
object . Найдите в Stack Overflow множество других обсуждений этого класса.
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ;
String output = weekAgoStart.format( f ) ;
Этот стандартный формат близок к тому, что вы хотите, но имеет T
посередине, где вам нужен ПРОБЕЛ. Так что замените ПРОБЕЛ на T
.
output = output.replace( "T" , " " ) ;
О java.time
Платформа java.time встроена в Java 8 и более поздние версии. Эти классы заменяют старые, вызывающие беспокойство, устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, который сейчас находится в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с Руководством по Oracle. И найдите в Stack Overflow множество примеров и пояснений. Спецификация - JSR 310.
Где получить классы java.time?
- Java SE 8, Java SE 9 и более поздние версии
- Встроено.
- Часть стандартного Java API с комплексной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функций java.time перенесена обратно на Java 6 и 7 в ThreeTen-Backport.
- Android
- Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
- Смотрите , как использовать ThreeTenABP ....
Джода-Время
Обновление: Проект Joda-Time теперь находится в режиме технического обслуживания. Команда рекомендует перейти на классы java.time.
Использование библиотеки Joda-Time значительно упрощает работу с датой и временем.
Обратите внимание на использование часового пояса. Если этот параметр опущен, вы работаете в UTC или текущем часовом поясе JVM по умолчанию.
DateTime now = DateTime.now ( DateTimeZone.forID( "America/Montreal" ) ) ;
DateTime weekAgo = now.minusWeeks( 1 );
DateTime weekAgoStart = weekAgo.withTimeAtStartOfDay();
Ответ 4
Попробуйте это
Один единственный метод получения даты из текущей или в обход любой даты
Второй метод @Pratik Butani для получения даты из нашей собственной даты, на мой взгляд, не работает.
Kotlin
fun getCalculatedDate(date: String, dateFormat: String, days: Int): String {
val cal = Calendar.getInstance()
val s = SimpleDateFormat(dateFormat)
if (date.isNotEmpty()) {
cal.time = s.parse(date)
}
cal.add(Calendar.DAY_OF_YEAR, days)
return s.format(Date(cal.timeInMillis))
}
Java
public static String getCalculatedDate(String date,String dateFormat, int days) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(dateFormat);
if (!date.isEmpty()) {
try {
cal.setTime(s.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
cal.add(Calendar.DAY_OF_YEAR, days);
return s.format(new Date(cal.getTimeInMillis()));
}
Использование
- getCalculatedDate("", "гггг-ММ-дд", -2) // Если вам нужна дата с сегодняшнего дня
- getCalculatedDate ("2019-11-05", "гггг-ММ-дд", -2) // Если вам нужна дата из вашего собственного