سؤال

كيف يمكنني الحصول على يوم الجمعة القادم مع Joda الوقت API.

على LocalDate اليوم هو today.يبدو لي عليك أن تقرر whever كنت قبل أو بعد الجمعة من الأسبوع الحالي.ترى هذه الطريقة:

private LocalDate calcNextFriday(LocalDate d) {
    LocalDate friday = d.dayOfWeek().setCopy(5);
    if (d.isBefore(friday)) {
        return d.dayOfWeek().setCopy(5);
    } else {
        return d.plusWeeks(1).dayOfWeek().setCopy(5);
    }
}

هل من الممكن أن تفعل ذلك أو أقصر مع oneliner?

PS:من فضلك لا تنصحني باستخدام JDKs التاريخ/الوقت المادة.Joda-الوقت هو أفضل بكثير API.

جافا 8 يدخل java.الوقت حزمة (البرنامج التعليمي) وهو أفضل حتى.

هل كانت مفيدة؟

المحلول

تحليل java.time

java.time إطار صلب جافا 8 و في وقت لاحق ( دروس ) يمكنك استخدام <لأ href = "HTTPS: // مستندات. oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjusters.html">TemporalAdjusters للحصول على next أو <وأ href = "https://docs.oracle.com/javase/8/docs/ المعهد / جافا / الوقت / الزمانية / TemporalAdjusters.html # سابقة-java.time.DayOfWeek - "> سابقة <لأ href =" http://docs.oracle.com/javase/8/docs/api/ جافا / الوقت / DayOfWeek.html "> يوم من الأسبوع .

private LocalDate calcNextFriday(LocalDate d) {
  return d.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
}

نصائح أخرى

ومن الممكن أن تفعل ذلك في أسهل بكثير لقراءة الطريقة:

if (d.getDayOfWeek() < DateTimeConstants.FRIDAY) {
    return d.withDayOfWeek(DateTimeConstants.FRIDAY));
} else if (d.getDayOfWeek() == DateTimeConstants.FRIDAY) {
    // almost useless branch, could be merged with the one above
    return d;
} else {
    return d.plusWeeks(1).withDayOfWeek(DateTimeConstants.FRIDAY));
}

وأو في شكل أقصر قليلا

private LocalDate calcNextFriday(LocalDate d) {    
    if (d.getDayOfWeek() < DateTimeConstants.FRIDAY) {
        d = d.withDayOfWeek(DateTimeConstants.FRIDAY));
    } else {
        d = d.plusWeeks(1).withDayOfWeek(DateTimeConstants.FRIDAY));
    }    
    return d; // note that there's a possibility original object is returned
}

وأو حتى أقصر

private LocalDate calcNextFriday(LocalDate d) {
    if (d.getDayOfWeek() >= DateTimeConstants.FRIDAY) {
        d = d.plusWeeks(1);
    }
    return d.withDayOfWeek(DateTimeConstants.FRIDAY);
}

PS. لم أكن اختبار رمز حقيقي! :)

والتعليمات البرمجية في السطر 1

private LocalDate calcNextFriday3(LocalDate d) {
    return d.isBefore(d.dayOfWeek().setCopy(5))?d.dayOfWeek().setCopy(5):d.plusWeeks(1).dayOfWeek().setCopy(5);
}

والنهج البديل

private LocalDate calcNextDay(LocalDate d, int weekday) {
    return (d.getDayOfWeek() < weekday)?d.withDayOfWeek(weekday):d.plusWeeks(1).withDayOfWeek(weekday);
}


private LocalDate calcNextFriday2(LocalDate d) {
    return calcNextDay(d,DateTimeConstants.FRIDAY);
}

واختبار بعض الشيء؛ -)

وأنا فقط يضيع مثل 30 دقيقة في محاولة لمعرفة هذا من نفسي ولكن كنت بحاجة إلى نوعيا لفة إلى الأمام.

وعلى أية حال هنا هو بلدي الحل:

public static DateTime rollForwardWith(ReadableInstant now, AbstractPartial lp) {
    DateTime dt = lp.toDateTime(now);
    while (dt.isBefore(now)) {
        dt = dt.withFieldAdded(lp.getFieldTypes()[0].getRangeDurationType(), 1);
    }
    return dt;
}

والآن كل ما تحتاجه لجعل جزئي (والذي هو LOCALDATE) ليوم من أيام الأسبوع.

Partial().with(DateTimeFieldType.dayOfWeek(), DateTimeConstants.FRIDAY); 

والآن مهما كان المجال الأكثر أهمية هو من الجزئي سيكون +1 إذا كان التاريخ الحالي هو بعد ذلك (الآن).

وهذا إذا قمت بإجراء جزئيا مع مارس 2012 أنه سيتم إنشاء التاريخ والوقت الجديد من مارس 2013 أو <.

import java.util.Calendar;

private Calendar getNextweekOfDay(int weekOfDay) {
    Calendar today = Calendar.getInstance();
    int dayOfWeek = today.get(Calendar.DAY_OF_WEEK);
    int daysUntilNextWeekOfDay = weekOfDay - dayOfWeek;
    if (daysUntilNextWeekOfDay == 0) daysUntilNextWeekOfDay = 7;
    Calendar nextWeekOfDay = (Calendar)today.clone();
    nextWeekOfDay.add(Calendar.DAY_OF_WEEK, daysUntilNextWeekOfDay);
    return nextWeekOfDay;
}

// set alarm for next Friday 9am
public void setAlarm() {
    Calendar calAlarm = getNextweekOfDay(Calendar.FRIDAY);
    calAlarm.set(Calendar.HOUR_OF_DAY, 9);//9am
    calAlarm.set(Calendar.MINUTE, 0);
    calAlarm.set(Calendar.SECOND, 0);
    scheduleAlarm(calAlarm);// this is my own method to schedule a pendingIntent
}

وعد بايتfvu الجواب يمكن اختصارها إلى أبعد من ذلك إلى:

private LocalDate calcNextFriday(LocalDate d) {
  return d.plusWeeks(d.getDayOfWeek() < DateTimeConstants.FRIDAY ? 0 : 1).withDayOfWeek(DateTimeConstants.FRIDAY);
}

بسيطة نمطية على أساس الحل الذي يجب أن تعمل مع أكثر من السابق إصدارات جافا في حالة لا يسمح لك لترقية إصدار جافا java8 أو بعده أو استخدام جافا القياسية تاريخ مكتبة jodatime

عدد الأيام إضافة إلى التاريخ الخاص بك هو هذه الصيغة :

(7 + التقويم.الجمعة - yourDateAsCalendar.الحصول على(التقويم.DAY_OF_WEEK)) % 7

نلاحظ أيضا أن هذا يمكن تعميمها على أي يوم من أيام الأسبوع عن طريق تغيير ثابت مجال التقويم.الجمعة إلى يوم من أيام الأسبوع معين.بعض مقتطف البرمجية أدناه

public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {

        Calendar cur = Calendar.getInstance();
        cur.add(Calendar.DAY_OF_MONTH, i);

        Calendar friday = Calendar.getInstance();
        friday.setTime(cur.getTime());
        friday.add(Calendar.DAY_OF_MONTH, (7 + Calendar.FRIDAY - cur.get(Calendar.DAY_OF_WEEK)) % 7);

        System.out.println(MessageFormat.format("Date {0} -> {1} ", cur.getTime(),  friday.getTime()));
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top