当前位置:  开发笔记 > 编程语言 > 正文

以MM/DD/YY格式解析日期并将其调整为当前/上个世纪的最佳方法是什么?

如何解决《以MM/DD/YY格式解析日期并将其调整为当前/上个世纪的最佳方法是什么?》经验,为你挑选了4个好方法。

我们的一位客户希望能够输入年份组件只有2位数的日期.该日期将在过去,因此如果2位数年份在当前年份之后,我们希望它在上个世纪工作,但如果2位数年份等于或小于当前年份,则工作在本世纪.

截至今天10/30/2008

01/01/01 = 01/01/2001

01/01/09 = 01/01/1909

这是一个奇怪的要求,我解决了这个问题,我只是不喜欢我的解决方案.感觉有更好的方法来做到这一点.

谢谢您的帮助.

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;
}

Ken Gentle.. 10

Groovy脚本(很容易引入java)演示@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


bobince.. 9

SimpleDateFormat已经为您使用两个字母的"yy"格式进行了两位数的年份解析.(显然它仍然允许四位数.)

默认情况下,它使用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大约是最糟糕的日期格式,并且最终会导致问题.



1> Ken Gentle..:

Groovy脚本(很容易引入java)演示@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



2> bobince..:

SimpleDateFormat已经为您使用两个字母的"yy"格式进行了两位数的年份解析.(显然它仍然允许四位数.)

默认情况下,它使用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大约是最糟糕的日期格式,并且最终会导致问题.



3> matt b..:

这个怎么样:

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解析String并将年份调整为上个世纪.

这样可以保证返回的所有日期都是过去的.但是,它没有说明在上个世纪之前可能被解析的任何日期- 例如,使用格式MM/dd/yyyy,日期字符串如"01/11/12"解析到公元12年1月11日



4> Jack Leow..:

如果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--日期和时间API,它将进入Java 7.所以我Joda Time基本上将在未来的Java版本中.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有