Как я могу получить вчерашнюю дату без использования Календаря в Java и без отметки времени только даты?

Я написал метод для получения текущей даты в формате yyyy-MM-dd и хочу иметь возможность также создать другой метод для получения вчерашней даты, за день до текущей даты. Для этого требуется дата, а не метка времени. Я не пытаюсь использовать Calendar. Я установил текущую дату следующим образом:

public class DateWithNoTimestamp
{
       private static final String CURRENT_DATE_FORMAT = "yyyy-MM-dd";

       public final static String getCurrentDate()
       {
               DateFormat dateFormat = new SimpleDateFormat(CURRENT_DATE_FORMAT);
               Date date = new Date();
               return dateFormat.format(date);
       } 
}

Это работает, чтобы получить текущую дату, теперь отдельный метод getYesertdayDate() У меня возникают проблемы. Как я могу настроить его так же, как и при getCurrentDate(), когда вычитал один день?

Ответ 1

Вы можете просто вычесть 1000 * 60 * 60 * 24 миллисекунды с даты и отформатировать это значение:

Date yesterday = new Date(System.currentTimeMillis() - 1000L * 60L * 60L * 24L));

Это быстрый и грязный способ, и, как отмечено в комментариях, он может сломаться, когда происходят переходные периоды перехода на летнее время (два дня в году). Рекомендуемыми альтернативами являются API календаря, Joda API или новый API-интерфейс JDK 8:

LocalDate today = LocalDate.now();
LocalDate yesterday = today.minusDays(1);

Ответ 2

Я обнаружил, что org.apache.commons.lang3.time.DateUtils более интуитивно понятен и прост в использовании.

По вашему вопросу

Date date = DateUtils.addDays(new Date(), -1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);

сделает трюк. И он хорошо работает и в JDK7 или ниже.

Ответ 3

С Java 8 и более поздними версиями используйте java.time.LocalDate класс:

LocalDate yesterday = LocalDate.now().minusDays(1L);

Ответ 4

Вы можете создать объект Date() для "вчера":

private static final String CURRENT_DATE_FORMAT = "yyyy-MM-dd";

public final static String format(Date date) {
    DateFormat dateFormat = new SimpleDateFormat(CURRENT_DATE_FORMAT);
    return dateFormat.format(date);
}

public final static String formatToday() {
    return format(new Date());
}

public final static String formatYesterday() {
    return format(new Date(new Date().getTime() - 24*3600*1000));
}

Ответ 5

Попробуйте следующее:

public class DateWithNoTimestamp
{
       private static final String CURRENT_DATE_FORMAT = "yyyy-MM-dd";

       public final static String getCurrentDate()
       {
           DateFormat dateFormat = new SimpleDateFormat(CURRENT_DATE_FORMAT);
           Date date = new Date();
           date .setTime(date.getTime()-24*60*60*1000);  // Subtract 24*60*60*1000 milliseconds
           return dateFormat.format(date);
       } 
}

Ответ 6

Пожалуйста, попробуйте это, чтобы получить дату вчера:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    long yourDateMillis = System.currentTimeMillis()- (24 * 60 * 60 * 1000);
                 Time yourDate = new Time();
         yourDate.set(yourDateMillis);

    String formattedDate = yourDate.format("%d-%m-%Y");
    txtViewYesterday.setText(formattedDate);}