Сравните, если две даты в течение одной недели в Android - PullRequest
7 голосов
/ 10 марта 2012

У меня есть две даты. Получите их из чего-то вроде ......

Calendar c=Calendar.getInstance();
year=c.get(c.YEAR);
month=c.get(c.MONTH);
month++;
date=c.get(c.DATE);

, а другая дата разбита на дату2, месяц2

Теперь я хочуПосмотрите, находятся ли они на одной и той же неделе.

Это возможно благодаря большому количеству вычислений и логики. Проблема возникает, когда 1-я дата предполагает 3 марта, а 2-я дата - 28 февраля.Они оба на одной неделе, но их сложно сравнить / проверить.Поэтому я хочу знать, есть ли встроенная функция или какой-либо способ их легко сравнить. Помогите ..........

Ответы [ 5 ]

13 голосов
/ 10 марта 2012

используйте что-то вроде этого:

Calendar c = Calendar.getInstance();
Integer year1 = c.get(c.YEAR);
Integer week1 = c.get(c.WEEK_OF_YEAR);

Calendar c = Calendar.getInstance();
c.setTimeInMillis(/*Second date in millis here*/);
Integer year2 = c.get(c.YEAR);
Integer week2 = c.get(c.WEEK_OF_YEAR);

if(year1 == year2) {
    if(week1 == week2) {
         //Do what you want here
    }
}

Это должно сделать это: D

5 голосов
/ 10 марта 2012

Вы можете получить номер недели для вашей даты, используя c.get(Calendar.WEEK_OF_YEAR) и сравнить результаты для ваших двух дат.

Также не рекомендуется обращаться к константам через переменные экземпляра (c.YEAR) - обращаться к ним с помощью классов (Calendar.YEAR).

3 голосов
/ 12 апреля 2016

Просто публикуем слегка измененное решение на основе @FabianCook и, как указал @harshal, его решение рассчитано не на две даты в разные годы, а на одну и ту же неделю.

Изменение заключается в том, чтобы фактически установить DAY_OF_WEEK в обеих календарных датах для указания на понедельник ..... в этом случае обе даты будут установлены на один и тот же день, даже если они находятся в разных годах, и затем мы можем сравнить их.

Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
int year1 = cal1.get(Calendar.YEAR);
int week1 = cal1.get(Calendar.WEEK_OF_YEAR);

Calendar cal2 = Calendar.getInstance();
cal2.setTimeInMillis(/*Second date in millis here*/);
cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
int year2 = cal2.get(Calendar.YEAR);
int week2 = cal2.get(Calendar.WEEK_OF_YEAR);

if(year1 == year2 && week1 == week2){
    //Do what you want here
}
1 голос
/ 23 ноября 2014

Это решение Java.Следующий сегмент кода проверяет, находятся ли две даты в пределах одной недели. Он также охватывает крайние случаи, когда неделя начинается в одном календарном году (декабрь) и заканчивается в следующем году (январь).

Примечание.joda-time:

compile 'joda-time:joda-time:2.3'


public static boolean isSameWeek(final Date d1, final Date d2) {
    if ((d1 == null) || (d2 == null))
        throw new IllegalArgumentException("The date must not be null");

    return isSameWeek(new DateTime(d1), new DateTime(d2));
}

public static boolean isSameWeek(final DateTime d1, final DateTime d2) {
    if ((d1 == null) || (d2 == null))
        throw new IllegalArgumentException("The date must not be null");

    // It is important to use week of week year & week year

    final int week1 = d1.getWeekOfWeekyear();
    final int week2 = d2.getWeekOfWeekyear();

    final int year1 = d1.getWeekyear();
    final int year2 = d2.getWeekyear();

    final int era1 = d1.getEra();
    final int era2 = d2.getEra();

    // Return true if week, year and era matches
    if ((week1 == week2) && (year1 == year2) && (era1 == era2))
        return true;

    // Return false if none of the conditions are satisfied
    return false;
}

Контрольный пример:

public class TestDateUtil {

@Test
public void testIsSameWeek() {

    final DateTime d1 = new DateTime(2014, 12, 31, 0, 0);
    final DateTime d2 = new DateTime(2015, 1, 1, 0, 0);
    final DateTime d3 = new DateTime(2015, 1, 2, 0, 0);
    final DateTime d4 = new DateTime(2015, 1, 8, 0, 0);

    assertTrue(isSameWeek(d1, d2));
    assertTrue(isSameWeek(d2, d1));

    assertTrue(isSameWeek(d2, d3));
    assertTrue(isSameWeek(d3, d2));

    assertFalse(isSameWeek(d2, d4));
    assertFalse(isSameWeek(d4, d2));

    assertFalse(isSameWeek(d1, d4));
    assertFalse(isSameWeek(d4, d1));

}
}
0 голосов
/ 18 мая 2016
private int weeksBetween(Calendar startDate, Calendar endDate) {
    startDate.set(Calendar.HOUR_OF_DAY, 0);
    startDate.set(Calendar.MINUTE, 0);
    startDate.set(Calendar.SECOND, 0);
    int start = (int)TimeUnit.MILLISECONDS.toDays(
        startDate.getTimeInMillis())
        - startDate.get(Calendar.DAY_OF_WEEK);
    int end = (int)TimeUnit.MILLISECONDS.toDays(
        endDate.getTimeInMillis());
    return (end - start) / 7;
}

, если этот метод возвращает 0, они находятся на той же неделе

, если этот метод возвращает 1 endDate - это неделя после startDate

, если этот метод возвращает -1, endDate - неделяперед startDate

вы получите идею

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