0

Android: Как получить дату за 7 дней назад (одна неделя)?

13

Заголовок: Как получить дату за неделю до текущей в формате "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 ответ(ов)

1

Чтобы разобрать дату в 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);

Таким образом, вы сможете удобно работать с датами и производить вычисления на основе них.

0

Вы можете создать собственную функцию для получения даты, предшествующей или следующей относительно текущей даты, используя следующий код на 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 дней от указанной даты

Таким образом, вы сможете легко получать нужные вам даты как от текущей, так и от заданной даты.

0

Попробуйте это

Единый метод для получения даты от текущей или обхода любой даты.

Метод Пратика Бутани для получения даты из нашей собственной даты не сработал у меня.

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()));
}

Использование

  1. getCalculatedDate("", "yyyy-MM-dd", -2) // Если вы хотите получить дату от сегодняшнего дня
  2. getCalculatedDate("2019-11-05", "yyyy-MM-dd", -2) // Если вы хотите получить дату от вашей собственной даты
0

Вы можете использовать следующий код для получения строки с информацией о том, сколько времени прошло с указанного времени.

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 и другие.

0

Вопрос: Как в 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!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь