Android получить дату до 7 дней (одна неделя) - PullRequest
34 голосов
/ 20 сентября 2010

Как получить дату раньше, чем через неделю в Android в этом формате:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Например: сейчас 2010-09-19 HH:mm:ss, до одной недели 2010-09-12 HH:mm:ss

Спасибо

Ответы [ 4 ]

93 голосов
/ 20 сентября 2010

Разобрать дату:

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);
15 голосов
/ 01 января 2015

Я создал свою собственную функцию, которая может быть полезна для получения следующей / предыдущей даты от

Текущая дата:

/**
 * 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
5 голосов
/ 01 января 2015

ТЛ; др

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. Поиск Переполнение стека для многих других дискуссий по этому классу.

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 Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где взять классы java.time?

Joda-Time

Обновление: Проект 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();
1 голос
/ 20 сентября 2010

Я вижу два пути:

  1. Используйте GregorianCalendar :

    Calendar someDate = GregorianCalendar.getInstance();
    someDate.add(Calendar.DAY_OF_YEAR, -7);
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String formattedDate = dateFormat.format(someDate);
    
  2. Используйте android.text.format.Time :

    long yourDateMillis = System.currentTimeMillis() - (7 * 24 * 60 * 60 * 1000);
    Time yourDate = new Time();
    yourDate.set(yourDateMillis);
    String formattedDate = yourDate.format("%Y-%m-%d %H:%M:%S");
    

Решение 1 является "официальным" способом Java, но использование GregorianCalendar может привести к серьезным проблемам с производительностью, поэтому инженеры Android добавили объект android.text.format.Time, чтобы это исправить.

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