سؤال

'2009-12 Dec' should be converted to '31-DEC-2009'
'2010-09 Sep' should be converted to '30-SEP-2010'
'2010-02 Feb' should be converted to '28-FEB-2010'
'2008-02 Feb' should be converted to '29-FEB-2008'

القيم 2009-12 ديسمبر, 2008-02 فبراير سيتم عرضه على المستخدم في المنسدلة. ليس لدى المستخدم خيار تحديد ملف يوم.

يجب تمرير القيمة المحددة للمستخدم إلى قاعدة البيانات. لكن قاعدة البيانات تتوقع التاريخ في التنسيق DD-MMM-YYYY. الاستعلام "<= USER_DATE' حالة. لذلك ، يجب تحديد اليوم الأخير من الشهر تلقائيًا وتمريره إلى قاعدة البيانات.

PL ساعدني في كتابة الوظيفة التي تقوم بالوظيفة أعلاه.

static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");

    public static String convertMapedToSqlFormat(final String maped) {
        String convertedMaped = null;
        //....
        return convertedMaped;
    }

    @Test
    public void testConvertMapedToSqlFormat() {
        String[] mapedValues = { "2009-12 Dec", "2009-11 Nov", "2009-10 Oct",
                "2009-09 Sep", "2009-08 Aug", "2009-07 Jul", "2009-06 Jun",
                "2009-05 May", "2009-04 Apr", "2009-03 Mar", "2009-02 Feb",
                "2009-01 Jan", "2008-12 Dec", "2008-11 Nov", "2008-10 Oct" };
        for (String maped : mapedValues) {
            System.out.println(convertMapedToSqlFormat(maped));
        }
    }
هل كانت مفيدة؟

المحلول

تحويله إلى Calendar والاستخدام Calendar#getActualMaximum() للحصول على اليوم الأخير من الشهر وتعيين اليوم معه.

مثال انطلاق:

String oldString = "2009-12 Dec";
Calendar calendar = Calendar.getInstance();
calendar.setTime(new SimpleDateFormat("yyyy-MM").parse(oldString)); // Yes, month name is ignored but we don't need this.
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
String newString = new SimpleDateFormat("dd-MMM-yyyy").format(calendar.getTime()).toUpperCase();
System.out.println(newString); // 31-DEC-2009

نصائح أخرى

  • استخدام الخاص بك DateFormat (لكن إصلاحه yyyy-dd MMM) لتحليل التاريخ
  • تحويل Date إلى Calendar
  • يستخدم Calendar.getActualMaximim()
  • استعمال dd-MMM-yyyy لتنسيق التاريخ الذي تم الحصول عليه.
  • مكالمة .toUpperCase()

لذا:

static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");
static SimpleDateFormat dbDateFormat = new SimpleDateFormat("yyyy-MMM-dd");

public static String convertMapedToSqlFormat(final String maped) {
    Date date = dateFormat.parse(mapped);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    return dbDateFormat.format(cal.getTime()).toUpperCase();
}

بعض الملاحظات:

  • إذا أمكن الاستخدام وقت جودا DateTime
  • تجنب وجود تنسيقات تاريخية صارمة في قاعدة البيانات.

احصل على العام والشهر من جزء Yyyy-MM من السلسلة.

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

مرحبًا ، عليك تحليل تاريخك ، مثل ذلك

      SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
      Date du = new Date();
      du = df.parse(sDate);
      df = new SimpleDateFormat("yyyy-MM-dd");
      sDate = df.format(du);

أتمنى أن يساعدك هذا. اسمحوا لي أن أعرف إذا كان الأمر كذلك.

PK

Java.Time

أسهل بكثير الآن مع فصول Java.time الحديثة التي تحل محل فصول وقت التاريخ القديمة المزعجة التي شوهدت هنا في السؤال والإجابات الأخرى.

ال Java.Time تم بناء إطار العمل في Java 8 وما بعده. تحل هذه الفصول محل فصول وقت التاريخ القديم المزعج مثل java.util.Date, .Calendar, & java.text.SimpleDateFormat.

في هذه اللحظة نمط الصيانة, ، ال وقت جودا ينصح المشروع أيضًا بالترحيل إلى Java.time.

لمعرفة المزيد ، انظر تعليمي أوراكل. والبحث في سعة مكدس للعديد من الأمثلة والتفسيرات.

يتم تشغيل الكثير من وظائف Java.time إلى Java 6 و 7 In Threeten-Backport وتكييف مزيد من التكيف مع ذكري المظهر في Threetenabp.

ال Threeten-extra يمتد المشروع Java.time مع فصول إضافية. هذا المشروع هو أرضية إثبات للإضافات المستقبلية المحتملة إلى Java.time.

YearMonth

ال YearMonth يوفر الفصل ما تريده فقط.

YearMonth start = YearMonth.of( 2008 , Month.OCTOBER );
YearMonth stop = YearMonth.of( 2009 , Month.DECEMBER );
List<YearMonth> yms = new ArrayList<>();
YearMonth ym = start ;
while( ! ym.isAfter( stop ) ) {
    yms.add( ym );
    // Set up the next loop.
    ym = ym.plusMonths( 1 ); 
}

لتقديم ، استخدم أ DateTimeFormatter لإنشاء تمثيل سلسلة من YearMonth القيمة.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM MMM" );
f = f.withLocale( Locale.CANADA_FRENCH );  // Or Locale.US etc.
String output = ym.format( f );

للحصول على آخر يوم من الشهر ، استجوب YearMonth هدف.

LocalDate endOfMonth = ym.atEndOfMonth();

لتقديم ، استخدم أ DateTimeFormatter. إما السماح لإنشاء إنشاء تنسيق يترجم تلقائيًا مناسبًا إلى محدد Locale, أو تحديد نمط التنسيق الخاص بك. يظهر عدة مرات في العديد من الأسئلة والأجوبة الأخرى على سعة مكدس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top