Android: Как получить дату за 7 дней назад (одна неделя)?
Заголовок: Как получить дату за неделю до текущей в формате "yyyy-MM-dd HH:mm:ss" на Android?
Текст проблемы: Я пытаюсь получить дату, которая будет за одну неделю до текущей на Android, в следующем формате:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Например, если сейчас дата выглядит как 2010-09-19 HH:mm:ss
, то дата за неделю до этого должна быть 2010-09-12 HH:mm:ss
.
Как я могу это реализовать?
Спасибо!
5 ответ(ов)
Чтобы разобрать дату в Java, вы можете использовать следующий код:
Date myDate = dateFormat.parse(dateString);
После этого, чтобы вычесть 7 дней из даты, у вас есть два варианта.
Первый способ — вычесть количество миллисекунд, как показано ниже:
Date newDate = new Date(myDate.getTime() - 604800000L); // 7 * 24 * 60 * 60 * 1000
Вы можете использовать постоянное значение 604800000L
, которое равно 7 дням в миллисекундах.
Второй способ — воспользоваться классом java.util.Calendar
, который предоставляет более удобный API для работы с датами:
Calendar calendar = Calendar.getInstance();
calendar.setTime(myDate);
calendar.add(Calendar.DAY_OF_YEAR, -7);
Date newDate = calendar.getTime();
В этом примере мы создаем экземпляр Calendar
, устанавливаем его на вашу дату и с помощью метода add
вычитаем 7 дней.
Если вам нужно преобразовать новую дату обратно в строку, используйте следующий код:
String date = dateFormat.format(newDate);
Таким образом, вы сможете удобно работать с датами и производить вычисления на основе них.
Вы можете создать собственную функцию для получения даты, предшествующей или следующей относительно текущей даты, используя следующий код на Java. Данная функция позволит вам передавать нужный формат даты и количество дней, которые нужно прибавить или вычесть.
Пример реализации
/**
* Укажите формат даты и количество дней, которые нужно вычесть из текущей даты.
* Если хотите получить предыдущую дату, передайте количество дней со знаком минус,
* в противном случае укажите положительное значение для получения следующей даты.
* @param dateFormat Формат даты
* @param days Количество дней
* @return Вычисленная дата
*/
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); // Вернет дату, которая была 10 дней назад от текущей даты
getCalculatedDate("dd-MM-yyyy", 10); // Вернет дату, которая будет через 10 дней от текущей даты
Если вы хотите получить вычисленную дату на основе вашей собственной даты, вы можете использовать следующую функцию:
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) {
Log.e("TAG", "Ошибка при парсинге даты: " + e.getMessage());
}
return null;
}
Пример с вашей датой
getCalculatedDate("01-01-2015", "dd-MM-yyyy", -10); // Вернет дату, которая была 10 дней назад от указанной даты
getCalculatedDate("01-01-2015", "dd-MM-yyyy", 10); // Вернет дату, которая будет через 10 дней от указанной даты
Таким образом, вы сможете легко получать нужные вам даты как от текущей, так и от заданной даты.
Попробуйте это
Единый метод для получения даты от текущей или обхода любой даты.
Метод Пратика Бутани для получения даты из нашей собственной даты не сработал у меня.
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("", "yyyy-MM-dd", -2)
// Если вы хотите получить дату от сегодняшнего дняgetCalculatedDate("2019-11-05", "yyyy-MM-dd", -2)
// Если вы хотите получить дату от вашей собственной даты
Вы можете использовать следующий код для получения строки с информацией о том, сколько времени прошло с указанного времени.
object DateUtil {
fun timeAgo(context: Context, time_ago: Long): String {
val curTime = Calendar.getInstance().timeInMillis / 1000
val timeElapsed = curTime - (time_ago / 1000)
val minutes = (timeElapsed / 60).toFloat().roundToInt()
val hours = (timeElapsed / 3600).toFloat().roundToInt()
val days = (timeElapsed / 86400).toFloat().roundToInt()
val weeks = (timeElapsed / 604800).toFloat().roundToInt()
val months = (timeElapsed / 2600640).toFloat().roundToInt()
val years = (timeElapsed / 31207680).toFloat().roundToInt()
// Секунды
return when {
timeElapsed <= 60 -> context.getString(R.string.just_now)
minutes <= 60 -> when (minutes) {
1 -> context.getString(R.string.x_minute_ago, minutes)
else -> context.getString(R.string.x_minute_ago, minutes)
}
hours <= 24 -> when (hours) {
1 -> context.getString(R.string.x_hour_ago, hours)
else -> context.getString(R.string.x_hours_ago, hours)
}
days <= 7 -> when (days) {
1 -> context.getString(R.string.yesterday)
else -> context.getString(R.string.x_days_ago, days)
}
weeks <= 4.3 -> when (weeks) {
1 -> context.getString(R.string.x_week_ago, weeks)
else -> context.getString(R.string.x_weeks_ago, weeks)
}
months <= 12 -> when (months) {
1 -> context.getString(R.string.x_month_ago, months)
else -> context.getString(R.string.x_months_ago, months)
}
else -> when (years) {
1 -> context.getString(R.string.x_year_ago, years)
else -> context.getString(R.string.x_years_ago, years)
}
}
}
}
Этот метод timeAgo
принимает контекст приложения и временную метку в миллисекундах, затем вычисляет разницу во времени и возвращает соответствующую строку, указывающую, сколько времени прошло. Убедитесь, что у вас есть необходимые строки в ресурсах для использования в методе, такие как just_now
, x_minute_ago
и другие.
Вопрос: Как в Kotlin создать расширение для типа Int
для представления недель, а затем использовать его для вычитания количества недель из даты?
Ответ:
Вы можете создать расширение для типа Int
, которое будет представлять неделю, с помощью класса Period
. Давайте рассмотрим, как это реализовать.
Во-первых, создайте расширение week
на типе Int
, которое будет возвращать объект Period
с соответствующими значениями period
и value
. Затем создайте оператор minus
для класса Date
, который будет позволять вычитать этот период из даты.
Вот пример реализации:
import java.util.*
val Int.week: Period
get() = Period(period = Calendar.WEEK_OF_MONTH, value = this)
internal val calendar: Calendar by lazy {
Calendar.getInstance()
}
operator fun Date.minus(duration: Period): Date {
calendar.time = this
calendar.add(duration.period, -duration.value)
return calendar.time
}
data class Period(val period: Int, val value: Int)
Пример использования:
val oldDate: Date = // ваша старая дата
val newDate = oldDate - 1.week
// Или можно использовать: val newDate = oldDate.minus(1.week)
Теперь, когда вы используете oldDate - 1.week
, это вычисляет новую дату, вычитая одну неделю из oldDate
. Вы можете также использовать метод minus
напрямую, если предпочитаете более явное выражение.
Это делает ваш код более читаемым и понятным, облегчая манипуляции с датами в приложении на Kotlin!
Показ сообщений "Утро", "День", "Вечер", "Ночь" в зависимости от времени в Java
Сортировка ArrayList пользовательских объектов по свойству
Использование контекста в фрагменте
Как проверить доступ к интернету на Android? InetAddress никогда не выдает таймаут
Room - Директория экспорта схемы не указана аннотационному процессору, не удается экспортировать схему