بالنظر إلى كائن التاريخ كيف يمكنني تحديد آخر يوم من الشهر ؟

StackOverflow https://stackoverflow.com/questions/72381

  •  09-06-2019
  •  | 
  •  

سؤال

أحاول استخدام التعليمات البرمجية التالية لكنه العودة يوم من الشهر.

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.MONTH, sampleDay.get(Calendar.MONTH)+1);
cal.set(Calendar.DAY_OF_MONTH, 0);
return cal.getTime();
هل كانت مفيدة؟

المحلول

الحصول على عدد أيام هذا الشهر:


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
int noOfLastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

تعيين التقويم إلى اليوم الأخير من هذا الشهر:


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

نصائح أخرى

وأود أن إنشاء كائن التسجيل في اليوم الأول من الشهر التالي ، ثم نطرح يوم واحد من تاريخ الاعتراض.

tl;dr

YearMonth.from(
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
).atEndOfMonth()

java.الوقت

السؤال إجابات أخرى استخدام عفا عليها الزمن القديم الطبقات.كانت من قبل محل java.الوقت دروس بنيت في جاوة 8 وما بعدها.انظر أوراكل التعليمي.الكثير من الوظائف وقد استدار إلى جافا 6 & 7 في ThreeTen-Backport و كذلك تتكيف مع الروبوت في ThreeTenABP.

LocalDate

على LocalDate تمثل الطبقة تاريخ فقط قيمة دون وقت من اليوم وبدون المنطقة الزمنية.في حين أن هذه الكائنات تخزين أي وقت من الأوقات المنطقة علما بأن المنطقة الزمنية هو الحاسم في تحديد التاريخ الحالي.في أي لحظة تاريخ يختلف في جميع أنحاء العالم من قبل المنطقة الزمنية.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );  // 2016-06-25

YearMonth

مع الجمع بين YearMonth فئة لتحديد آخر يوم من أي شهر.

YearMonth currentYearMonth = YearMonth.from( today );  // 2016-06
LocalDate lastDayOfCurrentYearMonth = currentYearMonth.atEndOfMonth();  // 2016-06-30

بالمناسبة, كل LocalDate و YearMonth استخدام شهر الأرقام كما تتوقعون (1-12) بدلا من أحمق 0-11 رأينا في التاريخ القديم-الوقت الطبقات.واحدة من العديد من الفقراء قرارات التصميم التي تجعل من تلك القديمة التاريخ-الوقت الطبقات حتى مزعجة ومربكة.

TemporalAdjuster

آخر صالحة النهج باستخدام TemporalAdjuster.انظر الجواب الصحيح من قبل بيير هنري.

استخدام calObject.getActualMaximum(calobject.DAY_OF_MONTH)

انظر ريال جافا كيف لمزيد من المعلومات حول هذا.

يبدو أنك تعيين التقويم إلى اليوم الأول من الشهر المقبل ، لذلك تحتاج واحد المزيد الخط إلى طرح يوم واحد ، للحصول على آخر يوم من الشهر هذا sampleDay في:

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.roll(Calendar.MONTH, true);
cal.set(Calendar.DAY_OF_MONTH, 0);
cal.add(Calendar.DAY_OF_MONTH, -1);

أنه من الأسهل بكثير أن تفعل هذا النوع من الشيء باستخدام Joda الوقت, على سبيل المثال:

DateTime date = new DateTime(sampleDay.getTime());
return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();

TemporalAdjuster

باستخدام (نسبيا) جافا جديدة تاريخ API, هو في الواقع من السهل جدا :

السماح date يكون مثيل LocalDate, على سبيل المثال :

LocalDate date = LocalDate.of(2018, 1, 22);

أو

LocalDate date = LocalDate.now();

أو بالطبع يمكنك الحصول على أنها مدخلات المستخدم من قاعدة البيانات ، إلخ.

ثم تطبيق تنفيذ TemporalAdjuster واجهة وجدت في TemporalAdjusters الدرجة:

LocalDate first = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDate last = date.with(TemporalAdjusters.lastDayOfMonth());

إذا كنت تستخدم date4j المكتبة:

DateTime monthEnd = dt.getEndOfMonth();

وأعتقد أن هذا يجب أن تعمل بشكل جيد:

Dim MyDate As Date = #11/14/2012#  'This is just an example date

MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top