سؤال

أنا أعمل على مشروع حيث شرط أن يكون تاريخ احتساب يجري في يوم الجمعة الأخير من شهر معين.أعتقد أن الحل الذي يستخدم جافا القياسية, ولكن أنا أتساءل عما إذا كان أي شخص يعرف أي شيء أكثر إيجازا أو كفاءة.وفيما يلي ما اختبرت مع هذا العام:

    for (int month = 0; month < 13; month++) {
        GregorianCalendar d = new GregorianCalendar();
        d.set(d.MONTH, month);
        System.out.println("Last Week of Month in " + d.getDisplayName(d.MONTH, Calendar.LONG, Locale.ENGLISH) + ": " + d.getLeastMaximum(d.WEEK_OF_MONTH));
        d.set(d.DAY_OF_WEEK, d.FRIDAY);
        d.set(d.WEEK_OF_MONTH, d.getActualMaximum(d.WEEK_OF_MONTH));
        while (d.get(d.MONTH) > month || d.get(d.MONTH) < month) {
            d.add(d.WEEK_OF_MONTH, -1);
        }
        Date dt = d.getTime();
        System.out.println("Last Friday of Last Week in  " + d.getDisplayName(d.MONTH, Calendar.LONG, Locale.ENGLISH) + ": " + dt.toString());
    }
هل كانت مفيدة؟

المحلول

على أساس marked23 هو اقتراح:

public Date getLastFriday( int month, int year ) {
   Calendar cal = Calendar.getInstance();
   cal.set( year, month + 1, 1 );
   cal.add( Calendar.DAY_OF_MONTH, -( cal.get( Calendar.DAY_OF_WEEK ) % 7 + 1 ) );
   return cal.getTime();
}

نصائح أخرى

السماح Calendar.class هل السحر بالنسبة لك ;)

pCal.set(GregorianCalendar.DAY_OF_WEEK,Calendar.FRIDAY);
pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);

أنت لا تحتاج إلى حلقة لمعرفة ذلك.تحديد "يوم الجمعة الماضي" تاريخ لهذا الشهر تبدأ مع أول يوم من الشهر القادم.طرح العدد المناسب من أيام اعتمادا على ما (العددية) يوم من أيام الأسبوع اليوم الأول من الشهر يصادف يوم.ها هو "يوم الجمعة الماضي." أنا متأكد من أنه يمكن أن يكون المغلي إلى الكاسح بطانة واحدة, ولكن أنا لست جافا dev.لذلك سأترك هذا إلى شخص آخر.

java.الوقت

باستخدام java.الوقت مكتبة بنيت في جاوة 8 وما بعدها, يمكنك استخدام TemporalAdjusters.lastInMonth:

val now = LocalDate.now() 
val lastInMonth = now.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY))

يمكنك اختيار أي يوم من DayOfWeek enum.

إذا كنت بحاجة إلى إضافة المعلومات في الوقت ، يمكنك استخدام أي LocalDate إلى LocalDateTime التحويل مثل

lastFriday.atStartOfDay() // e.g. 2015-11-27T00:00

وأود أن استخدام مكتبة مثل Jodatime.وقد مفيدة جدا API ويستخدم طبيعية الشهر الأرقام.والأفضل من كل ذلك هو الخيط آمنة.

أعتقد أنه يمكن أن يكون حلا مع (ولكن ربما لا أقصر ، ولكن بالتأكيد أكثر قابلية للقراءة):

DateTime now = new DateTime();      
DateTime dt = now.dayOfMonth().withMaximumValue().withDayOfWeek(DateTimeConstants.FRIDAY);
if (dt.getMonthOfYear() != now.getMonthOfYear()) {
  dt = dt.minusDays(7);
}       
System.out.println(dt);

عليك أن تعرف أمرين - عدد الأيام في الشهر من أيام الأسبوع الأول من الشهر يصادف يوم.

إذا كان أول يوم من الشهر هو

  • الأحد, ثم يوم الجمعة الماضي هو دائما 27.
  • الاثنين, ثم يوم الجمعة الماضي هو دائما 26.
  • الثلاثاء, ثم يوم الجمعة الماضي هو دائما 25.
  • الأربعاء ثم الجمعة الماضي هو 24 ، ما لم تكن هناك 31 يوما في الشهر ، ثم إنه 31
  • الخميس ثم يوم الجمعة الماضي هو 23 ، ما لم تكن هناك 30 يوما أو أكثر في الشهر ، ثم 30.
  • يوم الجمعة ثم يوم الجمعة الماضي هو 22 ، ما لم تكن هناك 29 يوما أو أكثر في الشهر ، ثم إنه 29.
  • يوم السبت ثم يوم الجمعة الماضي هو دائما 28.

هناك فقط ثلاث حالات خاصة.واحد تبديل البيان و ثلاثة إذا كانت البيانات (أو الثلاثي مشغلي إذا كنت مثل كل حال أن يكون هناك خط واحد...)

العمل بها على الورق.لا تحتاج إلى أي مكتبة خاصة, وظائف, جوليان التحويلات ، إلخ (حسنا ، إلا أن الحصول على يوم من أيام الأسبوع 1 يقع على, وربما عدد أيام ذلك الشهر...)

هارون تنفيذه في جافا.

-آدم

رمز آدم ديفيس الخوارزمية

public static int getLastFriday(int month, int year)
{
Calendar cal = Calendar.getInstance();
cal.set(year, month, 1, 0, 0, 0); // set to first day of the month
cal.set(Calendar.MILLISECOND, 0);

int firstDay = cal.get(Calendar.DAY_OF_WEEK);
int daysOfMonth = cal.getMaximum(Calendar.DAY_OF_MONTH);

switch (firstDay)
{
    case Calendar.SUNDAY :
        return 27;
    case Calendar.MONDAY :
        return 26;
    case Calendar.TUESDAY :
        return 25;
    case Calendar.WEDNESDAY :
        if (daysOfMonth == 31) return 31;
        return 24;
    case Calendar.THURSDAY :
        if (daysOfMonth >= 30) return 30;
        return 23;
    case Calendar.FRIDAY :
        if (daysOfMonth >= 29) return 29;
        return 22;
    case Calendar.SATURDAY :
        return 28;
}
throw new RuntimeException("what day of the month?");
}}

على الرغم من أنني أتفق مع scubabbl هنا هو نسخة بدون داخلي حين.

int year = 2008;
for (int m = Calendar.JANUARY; m <= Calendar.DECEMBER; m++) {
    Calendar cal = new GregorianCalendar(year, m, 1);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    int diff = Calendar.FRIDAY - cal.get(Calendar.DAY_OF_WEEK);
    if (diff > 0) {
        diff -= 7;
    }
    cal.add(Calendar.DAY_OF_MONTH, diff);
    System.out.println(cal.getTime());
}

أسهل قليلا لقراءة القوة الغاشمة النهج:

public int getLastFriday(int month, int year) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, 1, 0, 0, 0); // set to first day of the month
    cal.set(Calendar.MILLISECOND, 0);

    int friday = -1;
    while (cal.get(Calendar.MONTH) == month) { 
        if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) { // is it a friday?
            friday = cal.get(Calendar.DAY_OF_MONTH);
            cal.add(Calendar.DAY_OF_MONTH, 7); // skip 7 days
        } else {
            cal.add(Calendar.DAY_OF_MONTH, 1); // skip 1 day
        }
    }
    return friday;
}

هنا كيفية الحصول على آخر يوم الجمعة أو أي يوم من أيام الأسبوع, الشهر:

Calendar thisMonth = Calendar.getInstance();
dayOfWeek = Calendar.FRIDAY; // or whatever
thisMonth.set(Calendar.WEEK_OF_MONTH, thisMonth.getActualMaximum(Calendar.WEEK_OF_MONTH);;
thisMonth.set(Calendar.DAY_OF_WEEK, dayOfWeek);
int lastDay = thisMonth.get(Calendar.DAY_OF_MONTH); // this should be it.

أدناه البرنامج يوم الجمعة الأخير من كل شهر.ويمكن استخدامه للحصول على آخر في أي يوم من أيام الأسبوع في أي شهر.المتغير offset=0 يعني الشهر الحالي(تاريخ النظام) ، الإزاحة=1 يعني الشهر القادم جرا.على getLastFridayofMonth(int offset) طريقة سيعود يوم الجمعة الماضي.

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class LastFriday {

  public static Calendar getLastFriday(Calendar cal,int offset){
    int dayofweek;//1-Sunday,2-Monday so on....
    cal.set(Calendar.MONTH,cal.get(Calendar.MONTH)+offset);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); //set calendar to last day of month
    dayofweek=cal.get(Calendar.DAY_OF_WEEK); //get the day of the week for last day of month set above,1-sunday,2-monday etc
    if(dayofweek<Calendar.FRIDAY)  //Calendar.FRIDAY will return integer value =5 
      cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)-7+Calendar.FRIDAY-dayofweek);
    else
      cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)+Calendar.FRIDAY-dayofweek); 

    return cal;
  }

  public static String  getLastFridayofMonth(int offset) { //offset=0 mean current month
    final String DATE_FORMAT_NOW = "dd-MMM-yyyy";
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
    cal=getLastFriday(cal,offset);
    return sdf.format(cal.getTime()); 

  }

  public static void main(String[] args) {
    System.out.println(getLastFridayofMonth(0)); //0 = current month
    System.out.println(getLastFridayofMonth(1));//1=next month
    System.out.println(getLastFridayofMonth(2));//2=month after next month
  }

}

في جافا 8, يمكننا أن نفعل ذلك ببساطة على النحو التالي:

LocalDate lastFridayOfMonth = LocalDate
                                    .now()
                                    .with(lastDayOfMonth())
                                    .with(previous(DayOfWeek.FRIDAY));

يشبه تماما حل مقبول.إذا كان هذا يعمل ، واستخدامها.هذا هو الحد الأدنى رمز و ليس هناك أي سبب على الوجه الأمثل إلا إذا كان لديك إلى.

public static int lastSundayDate()
{
    Calendar cal = getCalendarInstance();
    cal.setTime(new Date(getUTCTimeMillis()));
    cal.set( Calendar.DAY_OF_MONTH , 25 );
    return (25 + 8 - (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY ? cal.get(Calendar.DAY_OF_WEEK) : 8));
}

ويساعد هذا الأمل..

public static void getSundaysInThisMonth(int monthNumber, int yearNumber){
    //int year =2009;
    //int dayOfWeek = Calendar.SUNDAY;
    // instantiate Calender and set to first Sunday of 2009
    Calendar cal = new GregorianCalendar();
    cal.set(Calendar.MONTH, monthNumber-1);
    cal.set(Calendar.YEAR, yearNumber);
    cal.set(Calendar.DATE, 1);
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
    int dateOfWeek = cal.get(Calendar.DATE);
    while (dayOfWeek  != Calendar.SUNDAY) {
       cal.set(Calendar.DATE, ++dateOfWeek);
       dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
      }
    cal.set(Calendar.DATE, dateOfWeek);

    int i = 1;
    while (cal.get(Calendar.YEAR) == yearNumber && cal.get(Calendar.MONTH)==monthNumber-1)
    {
            System.out.println("Sunday " + " " + i + ": " + cal.get(Calendar.DAY_OF_MONTH));
            cal.add(Calendar.DAY_OF_MONTH, 7);
            i++;
    }

  }
  public static void main(String args[]){
    getSundaysInThisMonth(1,2009);
  }
public static Calendar getNthDow(int month, int year, int dayOfWeek, int n) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, 1);
    cal.set(Calendar.DAY_OF_WEEK, dayOfWeek);
    cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, n);
    return (cal.get(Calendar.MONTH) == month) && (cal.get(Calendar.YEAR) == year) ? cal : null;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top