如何解析"dd-MM"日期格式以获取当前年份?

3

我需要使用Java解析日期格式为“17-Jun”,但问题是,当我尝试使用SimpleDateFormat解析格式为“dd-MM”的日期时,它返回的是"Wed Jun 17 00:00:00 IST 1970"。是否可能获取当前(2014)年份而不是1970年?

我的结果:
17/JUNE/1970

期望的结果:
17/JUNE/2014


1
设置时区,然后获取, 使用dd-mmm ......... - Rohit
1
一个简单的选项:在解析之前附加当前年份(以您感兴趣的任何时区为准)。我知道这不是理想的,但它是务实的... - Jon Skeet
为什么不直接将当前年份添加到您的输出中呢? - A.T.
JonSkeet和Arun:我必须解析其他格式[ dd-MMMM","MMMM-yy", "MMMM/yy","MMMM-yyyy", "MMMM/yyyy", "MM/dd/yy", "MM/dd/yyyy", "MM-dd-yyyy","dd-MMMM-yy", "dd/MMMM/yy", "dd-MMMM-yyyy", "dd/MMMM/yyyy", "MMMM dd, yyyy" ],因此我不能为其添加当前年份。 - user492888
@Rohit: 我会检查它。 - user492888
10个回答

5

看一下这个...

Calendar c = Calendar.getInstance();
c.set(Calendar.DATE, 17);
c.set(Calendar.MONTH, 5);
c.set(Calendar.YEAR, c.get(Calendar.YEAR));
Date date=new Date(c.getTimeInMillis());
SimpleDateFormat simpleDateformatter = new SimpleDateFormat("dd/mmm/yyyy");
String convertedDate = simpleDateformatter .format(date);

要获取年份,你可以直接使用:
Calendar cal = Calendar.getInstance();
cal.get(Calendar.YEAR) will fetch you current year

希望这有所帮助... :)

Aditya Kamath和Nand:我是指在调用代码“Date startDate = new SimpleDateFormat("dd-MM").parse("17-Jun")”时,是否有选项可以获得“17/JUNE/2014”而不是“17/JUNE/1970”作为结果。不使用Calendar类。 - user492888
嗯...据我所知,恐怕不行...但是为什么你不想使用日历呢? - Aditya Kamath
好的,没问题。我也可以使用日历API。非常感谢你。 - user492888

3

试试这个

    Calendar c = Calendar.getInstance();
        c.set(Calendar.DATE, 17);
       c.set(Calendar.MONTH, 5);
    c.set(Calendar.YEAR, c.get(Calendar.YEAR));
Date d=new Date(c.getTimeInMillis());
    SimpleDateFormat formatter = new SimpleDateFormat("dd- mmm");
        String conDate = formatter.format(d);

南德和普拉巴卡兰:你们俩的代码都可以运作,但有没有默认的方法/方式来获取带有当前年份的日期? - user492888
是的,你可以使用 c.get(Calendar.DATE) 来获取今天的日期。 - Nand
谢谢。这非常有用。 - user492888

2

java.time

在Java 8中,您可以执行以下操作:

   DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d-MMM");
   MonthDay md = MonthDay.parse("17-Jun", dtf);
   LocalDate d = LocalDate.now().with(md);
   System.out.println(d.getDayOfMonth());
   System.out.println(d.getMonthValue());
   System.out.println(d.getYear());

2

这样做

Date date = new SimpleDateFormat("dd-MMM-yyyy").parse("17-Jun-"+ Calendar.getInstance().get(Calendar.YEAR));

2

你需要编写一个实用方法,SimpleDateFormat中没有任何东西可以将不存在的年份解释为当前年份。可以尝试像这样编写:

public static Date parseDate(String dateString) throws ParseException {

    //determine current year
    Calendar today = Calendar.getInstance();
    int currentYear = today.get(Calendar.YEAR);

    //parse input
    SimpleDateFormat format = new SimpleDateFormat("dd-MMM");
    Date parsed = format.parse(dateString);

    // set current year on parsed value
    Calendar cal = Calendar.getInstance();
    cal.setTime(parsed);
    cal.set(Calendar.YEAR, currentYear);

    return cal.getTime();

}

Greg Case:谢谢。 - user492888

2

试试这个:

SimpleDateFormat dfDate  = new SimpleDateFormat("dd-MM-yyyy");
java.util.Date d = null;

try {
                d = dfDate.parse("17-Jun-"+ Calendar.getInstance().get(Calendar.YEAR));

            } catch (java.text.ParseException e) {
                e.printStackTrace();
            }
System.out.println(""+d );

您的问题将会得到解决。


1

1

虽然有点晚,但如果您真的不想使用日历 - 正如我从您对上面正确答案的评论中了解到的一样 - (不推荐使用已弃用的方法,但仍然可以):

SimpleDateFormat format = new SimpleDateFormat("dd-MMM");
Date date = format.parse("17-JUN");
date.setYear(new Date().getYear());
System.out.println(date);

输出:

2014年6月17日 星期二 00:00:00 IST


PopoFibo:我现在会尝试它。 - user492888
@user492888 好的,非常好。 - StoopidDonut
谢谢。但唯一的问题是它是已弃用的API。 - user492888
@user492888 是的,确实如此。我在您上面的评论中看到您根本不想使用日历 - 因此出现了弃用的方法。 - StoopidDonut

1

这里给出的所有答案都或多或少是正确的,但我注意到还有一个细节方面被忽略了,即日期和月份的组合是否适合当前年份(2月29日的问题)。因此,我建议进行严格的解析,如下所示:

String ddMMM = "17-Jun";
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
sdf.setLenient(false); // in order to check for "29-Feb"
TimeZone tz = TimeZone.getDefault(); // or change to your specific time zone
Date date = 
  sdf.parse(ddMMM + "-" + new GregorianCalendar(tz).get(Calendar.YEAR));

Meno Hochschild:谢谢。我会将lenient设置为false。 - user492888

0

试一试,

    String s2 = "Wed Jun 17 00:00:00 1970";
    SimpleDateFormat sdf1 = new SimpleDateFormat("E MMM dd hh:mm:ss yyyy");
    SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MMM/yyyy");
    try {

        Date d1 = sdf1.parse(s2);
        System.out.println(d1);

        String s3 = sdf2.format(d1);
        System.out.println("Before Changing :: "+s3);

        Calendar cal = Calendar.getInstance();
        cal.setTime(d1);
        cal.add(Calendar.YEAR, 2014-1970);
        d1 = cal.getTime();
        String s4 =  sdf2.format(d1);
        System.out.println("After Changing  :: "+s4);

    } catch (ParseException e) {
        e.printStackTrace();
    }

输出

Before Changing :: 17/Jun/1970
After Changing  :: 17/Jun/2014

你的代码能够正常工作,但是我们需要手动提供2014年(当前年份)吗?或者可以自动获取它吗? - user492888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接