ما هي أفضل طريقة لتحليل تاريخ في MM / DD شكل / YY وتعديله لالحالي القرن / السابق؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

واعتبارا من اليوم 2008/10/30

و01/01/01 = 01/01/2001

و01/01/09 = 1909/01/01

وهذا هو شرط غريب، وأنا حل المشكلة، وأنا لا أحب بلدي الحل. بدا الامر وكأننا هناك طريقة أفضل للقيام بذلك.

وشكرا للمساعدة.

public static String stupidDate(String dateString)
{
    String twoDigitYear = StringUtils.right(dateString, 2);
    String newDate = StringUtils.left(dateString, dateString.length() - 2);
    int year = NumberUtils.toInt(twoDigitYear);
    Calendar c = GregorianCalendar.getInstance();
    int centuryInt = c.get(Calendar.YEAR) - year;
    newDate = newDate + StringUtils.left(Integer.toString(centuryInt), 2) + twoDigitYear;
    return newDate;
}
هل كانت مفيدة؟

المحلول

وسيناريو رائع (من السهل بما فيه الكفاية لرمي في جافا) مما يدل علىbobince النقطة حول SimpleDateFormat.

import java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat('MM/dd/yy')
SimpleDateFormat fmt = new SimpleDateFormat('yyyy-MM-dd')

Calendar cal = Calendar.getInstance()
cal.add(Calendar.YEAR, -100)
sdf.set2DigitYearStart(cal.getTime())

dates = ['01/01/01', '10/30/08','01/01/09']
dates.each {String d ->
  println fmt.format(sdf.parse(d))
}

والعائد

2001-01-01
2008-10-30
1909-01-01

نصائح أخرى

وSimpleDateFormat لا بالفعل رقمين العام تحليل بالنسبة لك، وذلك باستخدام المكون من حرفين 'yyyy إنهاء "الشكل. (وسوف لا تزال تسمح أربعة أرقام، ومن الواضح.)

وافتراضيا أنه يستخدم الآن 80 → الآن + 20، حتى انها ليست بالضبط نفس القاعدة التي تقترح، لكنه معقول وموحدة (في العالم جافا على الأقل)، ويمكن أن يتم تجاوز باستخدام set2DigitYearStart () إذا كنت تريد .

DateFormat informat= new SimpleDateFormat("MM/dd/yy");
DateFormat outformat= new SimpleDateFormat("MM/dd/yyyy");
return outformat.format(informat.parse(dateString));

في المدى الطويل، في محاولة للهجرة إلى ISO8601 تاريخ التنسيق (س س س س-MM-DD)، لأن MM / يوم / سنة تقريبا هو أسوأ شكل وقت ممكن ولا بد أن يسبب مشاكل في نهاية المطاف.

وماذا عن هذا:

public static String anEasierStupidDateWithNoStringParsing(String dateString) {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy");

    //handling ParseExceptions is an exercise left to the reader!
    Date date = df.parse(dateString);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);

    Calendar now = Calendar.getInstance();
    if (cal.after(now)) {
        cal.add(Calendar.YEAR, -100);
    }

    return cal;
}

وبعبارة أخرى، اسمحوا SimpleDateFormat تحليل سلسلة ومجرد تعديل هذا العام ليكون القرن الماضي إذا SimpleDateFormat (<لأ href = "http://java.sun.com/j2se/1.4.2/docs/api/ جافا / النص / SimpleDateFormat.html "يختلط =" noreferrer "> التي لديها انها قواعد الخاصة لتفسير السلاسل العام ) بإرجاع التاريخ الذي هو بعد التاريخ الحالي.

وهذا من شأنه أن نضمن أن جميع مواعيد عاد في الماضي. ومع ذلك، فإنه لا يأخذ في الحسبان أي التواريخ التي يمكن تحليل ك <م> قبل هذا القرن الماضي - على سبيل المثال، مع التنسيق MM/dd/yyyy، سلسلة تاريخ مثل "01/11/12" يوزع إلى 11 يناير 12 AD

إذا Joda الوقت هو خيار:

String inputDate = "01/01/08";
// assuming U.S. style date, since it's not clear from your original question
DateTimeFormatter parser = DateTimeFormat.forPattern("MM/dd/yy");
DateTime dateTime = parser.parseDateTime(inputDate);
// if after current time
if (dateTime.isAfter(new DateTime())) {
    dateTime = dateTime.minus(Years.ONE);
}

return dateTime.toString("MM/dd/yyyy");

وأنا أعلم Joda الوقت ليس جزء من جافا SE، وكما قلت في موضوع آخر، وأنا عادة لا تتغاضى عن استخدام مكتبة طرف ثالث عندما يكون هناك مكتبة جافا أن يفعل الشيء نفسه. ومع ذلك، فإن الشخص الذي يقوم بتطوير Joda الوقت ويؤدي أيضا JSR310 - التاريخ والوقت API التي سوف جعله جافا 7. لذلك أنا Joda وقت هو في الأساس ستكون في جاوة الإصدارات المستقبلية

Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);

العمل بالنسبة لي.

تحليل المحورية السنة في Joda وقت

وتتضمن ممتازة Joda وقت 2.5 مكتبة هذه الوظيفة. لا حاجة لكتابة أي رمز نفسك. الرجاء الاتصال withPivotYear() DateTimeFormatter . نرى أن وثيقة مرتبطة للحصول على أمثلة على كيفية استخدامها.

وأفضل طريقة هي استخدام API Joda وقت لالتواريخ والأوقات في جاوة.

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