Дата проверки с сегодняшней датой
Я написал некоторый код для проверки двух дат, даты начала и даты окончания. Если дата окончания предшествует дате начала, будет выдано сообщение о том, что дата окончания предшествует дате начала.
Я также хочу добавить проверку того, является ли дата начала до сегодняшнего дня (сегодня, как в день, когда пользователь использует приложение). Как мне это сделать? (Код проверки даты ниже, также все это написано для Android, если это имеет какое-либо отношение)
if (startYear > endYear) {
fill = fill + 1;
message = message + "End Date is Before Start Date" + "\n";
} else if (startMonth > endMonth && startYear >= endYear) {
fill = fill + 1;
message = message + "End Date is Before Start Date" + "\n";
} else if (startDay > endDay && startMonth >= endMonth && startYear >= endYear) {
fill = fill + 1;
message = message + "End Date is Before Start Date" + "\n";
}
Ответы
Ответ 1
Помогает ли это?
Calendar c = Calendar.getInstance();
// set the calendar to start of today
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
// and get that as a Date
Date today = c.getTime();
// or as a timestamp in milliseconds
long todayInMillis = c.getTimeInMillis();
// user-specified date which you are testing
// let say the components come from a form or something
int year = 2011;
int month = 5;
int dayOfMonth = 20;
// reuse the calendar to set user specified date
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
// and get that as a Date
Date dateSpecified = c.getTime();
// test your condition
if (dateSpecified.before(today)) {
System.err.println("Date specified [" + dateSpecified + "] is before today [" + today + "]");
} else {
System.err.println("Date specified [" + dateSpecified + "] is NOT before today [" + today + "]");
}
Ответ 2
Не слишком усложняйте это. Используйте этот простой способ. Импортируйте DateUtils java класс и вызовите следующие методы, которые возвращают логическое значение.
DateUtils.isSameDay(date1,date2);
DateUtils.isSameDay(calender1,calender2);
DateUtils.isToday(date1);
Для получения дополнительной информации обратитесь к этой статье DateUtils Java
Ответ 3
У Android уже есть специальный класс для этого. Проверьте DateUtils.isToday (долго, когда)
Ответ 4
Используя Joda Time, можно упростить:
DateMidnight startDate = new DateMidnight(startYear, startMonth, startDay);
if (startDate.isBeforeNow())
{
// startDate is before now
// do something...
}
Ответ 5
Другие ответы игнорируют критическую проблему часового пояса.
Другие ответы используют устаревшие классы.
Избегайте старых классов даты и времени
Старые классы даты и времени, включенные в ранние версии Java, плохо разработаны, сбивают с толку и создают проблемы. Избегайте java.util.Date/.Calendar и связанных классов.
java.time
LocalDate
Для значений только для даты, без времени суток и без часового пояса, используйте класс LocalDate
.
LocalDate start = LocalDate.of( 2016 , 1 , 1 );
LocalDate stop = start.plusWeeks( 1 );
часовой пояс
Имейте в виду, что хотя LocalDate
не хранит часовой пояс, для определения даты, такой как "сегодня", требуется часовой пояс. В любой момент времени дата может варьироваться в зависимости от часового пояса. Например, в Париже новый день наступает раньше, чем в Монреале. Момент после полуночи в Париже все еще "вчера" в Монреале.
Если у вас есть смещение от UTC, используйте ZoneOffset
. Если у вас полный часовой пояс (континент/регион), используйте ZoneId
. Если вы хотите использовать UTC, используйте удобную константу ZoneOffset.UTC
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
Сравнение легко с методами isEqual
, isBefore
и isAfter
.
boolean invalidInterval = stop.isBefore( start );
Мы можем проверить, содержится ли сегодняшний день в этом диапазоне дат. В моей логике, показанной здесь, я использую подход Half-Open, где начало включительно, а окончание - эксклюзивно. Такой подход распространен в работе с датой и временем. Так, например, неделя начинается с понедельника до, но не включая следующий понедельник.
// Is today equal or after start (not before) AND today is before stop.
boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ) ;
Interval
Если вы интенсивно работаете с такими промежутками времени, рассмотрите возможность добавления библиотеки ThreeTen-Extra в свой проект. Эта библиотека расширяет фреймворк java.time и является полигоном для возможных дополнений к java.time.
ThreeTen-Extra включает в себя класс Interval
с удобными методами, такими как abuts
, contains
, encloses
, overlaps
и т.д.
О java.time
Среда java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time, который теперь находится в режиме обслуживания, рекомендует выполнить переход на классы java.time.
Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в классах java.sql.*
.
Где взять классы java.time?
Ответ 6
public static boolean isToday(Date date){
Calendar today = Calendar.getInstance();
Calendar specifiedDate = Calendar.getInstance();
specifiedDate.setTime(date);
return today.get(Calendar.DAY_OF_MONTH) == specifiedDate.get(Calendar.DAY_OF_MONTH)
&& today.get(Calendar.MONTH) == specifiedDate.get(Calendar.MONTH)
&& today.get(Calendar.YEAR) == specifiedDate.get(Calendar.YEAR);
}
Ответ 7
чтобы проверить, соответствует ли дата сегодняшней дате или не только проверять даты, не включенные в это время, так что время 00:00:00 и использовать код ниже
Calendar c = Calendar.getInstance();
// set the calendar to start of today
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
Date today = c.getTime();
// or as a timestamp in milliseconds
long todayInMillis = c.getTimeInMillis();
int dayOfMonth = 24;
int month = 4;
int year =2013;
// reuse the calendar to set user specified date
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month - 1);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
// and get that as a Date
Date dateSpecified = c.getTime();
// test your condition
if (dateSpecified.before(today)) {
Log.v(" date is previou")
} else if (dateSpecified.equal(today)) {
Log.v(" date is today ")
}
else if (dateSpecified.after(today)) {
Log.v(" date is future date ")
}
Надеюсь, это поможет...
Ответ 8
boolean isBeforeToday(Date d) {
Date today = new Date();
today.setHours(0);
today.setMinutes(0);
today.setSeconds(0);
return d.before(today);
}
Ответ 9
Я предполагаю, что вы используете целые числа для представления своего года, месяца и дня? Если вы хотите оставаться последовательным, используйте методы Date.
Calendar cal = new Calendar();
int currentYear, currentMonth, currentDay;
currentYear = cal.get(Calendar.YEAR);
currentMonth = cal.get(Calendar.MONTH);
currentDay = cal.get(Calendar.DAY_OF_WEEK);
if(startYear < currentYear)
{
message = message + "Start Date is Before Today" + "\n";
}
else if(startMonth < currentMonth && startYear <= currentYear)
{
message = message + "Start Date is Before Today" + "\n";
}
else if(startDay < currentDay && startMonth <= currentMonth && startYear <= currentYear)
{
message = message + "Start Date is Before Today" + "\n";
}
Ответ 10
другой способ выполнить эту операцию:
public class TimeUtils {
/**
* @param timestamp
* @return
*/
public static boolean isToday(long timestamp) {
Calendar now = Calendar.getInstance();
Calendar timeToCheck = Calendar.getInstance();
timeToCheck.setTimeInMillis(timestamp);
return (now.get(Calendar.YEAR) == timeToCheck.get(Calendar.YEAR)
&& now.get(Calendar.DAY_OF_YEAR) == timeToCheck.get(Calendar.DAY_OF_YEAR));
}
}
Ответ 11
Попробуйте следующее:
public static boolean isToday(Date date)
{
return org.apache.commons.lang3.time.DateUtils.isSameDay(Calendar.getInstance().getTime(),date);
}
Ответ 12
public static boolean itIsToday(long date){
boolean result = false;
try{
Calendar calendarData = Calendar.getInstance();
calendarData.setTimeInMillis(date);
calendarData.set(Calendar.HOUR_OF_DAY, 0);
calendarData.set(Calendar.MINUTE, 0);
calendarData.set(Calendar.SECOND, 0);
calendarData.set(Calendar.MILLISECOND, 0);
Calendar calendarToday = Calendar.getInstance();
calendarToday.setTimeInMillis(System.currentTimeMillis());
calendarToday.set(Calendar.HOUR_OF_DAY, 0);
calendarToday.set(Calendar.MINUTE, 0);
calendarToday.set(Calendar.SECOND, 0);
calendarToday.set(Calendar.MILLISECOND, 0);
if(calendarToday.getTimeInMillis() == calendarData.getTimeInMillis()) {
result = true;
}
}catch (Exception exception){
Log.e(TAG, exception);
}
return result;
}