11

顧客の 1 人が、年の部分が 2 桁だけの日付を入力できるようにしたいと考えています。日付は過去の日付になるため、2 桁の年が現在の年より後の場合は前の世紀で機能するようにしますが、2 桁の年が現在の年以下の場合は現在の世紀で機能するようにします。

2008 年 10 月 30 日現在

01/01/01 = 2001/01/01

09/01/01 = 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;
}
4

5 に答える 5

12

SimpleDateFormatについて@bobinceが指摘した点を示すGroovyスクリプト(Javaにスローするのに十分簡単)。

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
于 2008-10-30T21:25:40.493 に答える
9

SimpleDateFormat は、2 文字の 'yy' 形式を使用して、既に 2 桁の年の解析を行っています。(明らかに、4 桁は許可されます。)

デフォルトでは now-80→now+20 を使用するため、提案したルールとまったく同じではありませんが、合理的で標準化されており (少なくとも Java の世界では)、必要に応じて set2DigitYearStart() を使用してオーバーライドできます。

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

長期的には、ISO8601 日付形式 (yyyy-MM-dd) への移行を試みてください。これは、MM/dd/yy がほぼ最悪の日付形式であり、最終的に問題を引き起こす可能性があるためです。

于 2008-10-30T20:49:53.437 に答える
8

これはどう:

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が文字列を解析し、S​​impleDateFormat(年の文字列を解釈するための独自のルールがある)が現在の日付より後の日付を返す場合は、年を前世紀に調整します。

これにより、返されるすべての日付が過去のものであることが保証されます。ただし、この前世紀以前のように解析される可能性のある日付は考慮されません。たとえば、 MM/dd/yyyy「01/11/12」のような日付文字列は、西暦12年1月11日に解析されます。

于 2008-10-30T20:09:45.123 に答える
5

Joda Time がオプションの場合:

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 Time が Java SE の一部ではないことは知っています。別のスレッドで述べたように、同じことを行う Java ライブラリがある場合、通常、サードパーティのライブラリを使用することは容認しません。ただし、Joda Time を開発している人は、JSR310 (Java 7 に組み込まれる予定の日付と時刻の API) もリードしています。つまり、Joda Time は基本的に、将来の Java リリースで使用される予定です。

于 2008-10-30T20:49:21.953 に答える