Java Date определяет, больше ли DAY - PullRequest
3 голосов
/ 11 июля 2011

У меня есть метки времени в формате строки. Sun 10 июля, 17:47:55 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2011

Мне нужно определить, больше ли текущий ДЕНЬ, чем сохраненный день.

Я получутекущий день с Date currentDate = new Date();

, и я проанализирую свою строку в Date объект с SimpleDateFormat dateParser = new SimpleDateParser("E MMM d HH:mm:ss z y");

, но с использованием функции currentDate.after () или *Функция 1012 * только скажет мне, если ЛЮБАЯ дата больше или меньше, что включает в себя часы, минуты или секунды.

Так что мой следующий догадка будет преобразовать дату в день года, исравните новые целые числа, если integer1> integer2, то ... но как бы я это сделал?

Я также рассмотрел разбиение строки до подстроки, состоящей только из первой половины сохраненной строки даты.Sun Jul 10 до Sun Jul 10 но проблема здесь в том, что дневное значение иногда составляет 1 цифру, а иногда 2 цифры.

Также я думаю, что абстрактный класс Calendar - лучший способ сделать это, ноЯ не уверен, и в настоящее время в тумане о том, как преобразовать объекты Date в объект Calendar для сравнения!

Понимание ценится

Ответы [ 5 ]

3 голосов
/ 11 июля 2011

Это может быть полезно в вашем случае (как быстрый способ):

Locale.setDefault(Locale.UK);
String storedDateString = "Sun Jul 10 17:47:55 EDT 2011";
SimpleDateFormat dateParser = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");

Date storedDate = dateParser.parse(storedDateString);

GregorianCalendar storedCal = new GregorianCalendar();
storedCal.setTime(storedDate);
GregorianCalendar currentCal = new GregorianCalendar();

int storedDayOfYear = storedCal.get(Calendar.DAY_OF_YEAR);
int currentDayofYear = currentCal.get(Calendar.DAY_OF_YEAR);

//int storedDayYear = storedCal.get(Calendar.YEAR);
//int currentDayYear = storedCal.get(Calendar.YEAR);

System.out.println(storedDayOfYear);
System.out.println(currentDayofYear);

//System.out.println(storedDayYear);
//System.out.println(currentDayYear);

Результат:

191
192

После этого сравнивать значения int просто.

1 голос
/ 11 июля 2011

Если вы хотите преобразовать объект Date в объект календаря, используйте

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date());

Вы можете получить значение дня объекта Calendar с помощью

    cal.get(Calendar.DAY_OF_MONTH);

или

    calendar.get(Calendar.DAY_OF_YEAR);

однако обратите внимание, что при сравнении дат разных месяцев (первый пример) или лет (второй пример) это не сработает.Вам лучше установить миллисекунды, секунды, минуты и часы на 0 для каждого объекта Календаря и сравнить объекты:

    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(date1);
    c2.setTime(date2);

    c1.set(Calendar.MILLISECOND, 0);
    c1.set(Calendar.SECOND, 0);
    c1.set(Calendar.MINUTE, 0);
    c1.set(Calendar.HOUR, 0);

    c2.set(Calendar.MILLISECOND, 0);
    c2.set(Calendar.SECOND, 0);
    c2.set(Calendar.MINUTE, 0);
    c2.set(Calendar.HOUR, 0);

    c1.compareTo(c2);
0 голосов
/ 17 июня 2017

tl; др

ZonedDateTime.parse( 
    "Sun Jul 10 17:47:55 EDT 2011" , 
    DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US ) 
).getDayOfYear()

191

День года

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

Эта идея дня года часто ошибочно помечается как юлианские даты, но должным образом известнакак Порядковая дата .И даже это включает год, такой как 2017-186.Но, по-видимому, вам нужен просто день в году, число от 1 до 365 или 366.

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

Современный подход использует классы java.time, которые вытесняют проблемные.старые классы даты и времени, которые вы используете.

Сначала проанализируйте вашу строку как ZonedDateTime.

String input = "Sun Jul 10 17:47:55 EDT 2011" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US ) ;
ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ;

zdt.toString (): 2011-07-10T17: 47: 55-04: 00 [America / New_York]

Кстати, никогда не используйте 3-4-буквенное сокращение, например EST или IST, так как они не истинные часовые пояса, не стандартизированные и даже не уникальные (!).Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.

Наконец, получите искомое целое число дня в году.

int dayOfYear = zdt.getDayOfYear() ;

dayOfYear: 191

См. этот код запускается вживуюIdeOne.com .

0 голосов
/ 11 июля 2011

Прежде всего, преобразуйте объект Date в String, используя toString().Как только это будет сделано, разделите строку, используя split(" ").Это вернет String[].Поскольку оба формата одинаковы, следовательно, в обоих массивах, third element will contain the date и second element will be month.

Если месяц один и тот же, то вам нужно только увидеть, какая дата больше другой (вы можететакже проверьте годы).

0 голосов
/ 11 июля 2011
Calendar cal = Calendar.getInstance();  // use the getInstance(TimeZone zone) overload
                                        // if you want some other timezone than the
                                        // default one
cal.setTime(yourDate);
cal.get(Calendar.DAY_OF_MONTH);
...