如何把Gregorian string转换成Gregorian Calendar?

时间:2014-09-12 11:37:12

标签: java calendar java-ee-7 gregorian-calendar

我必须根据日历日期计算某些内容,但我收到了完整的公历日历字符串值。

例如,i / p收到了{may be - "new GregorianCalendar().toString()"} as String :- java.util.GregorianCalendar[time=1410521241348,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/London",offset=0,dstSavings=3600000,useDaylight=true,transitions=242,lastRule=java.util.SimpleTimeZone[id=Europe/London,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=8,WEEK_OF_YEAR=37,WEEK_OF_MONTH=2,DAY_OF_MONTH=12,DAY_OF_YEAR=255,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=27,SECOND=21,MILLISECOND=348,ZONE_OFFSET=0,DST_OFFSET=3600000]

我想提取日历的日期值以处理进一步的计算。

3 个答案:

答案 0 :(得分:3)

您可以在输入字符串中找到时间并将其转换为公历。然后,您必须按ZoneInfo字段中的指定设置其时区。这样的事情可能有用:

    String calendarAsString="java.util.GregorianCalendar[time=1410521241348,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Europe/London\",offset=0,dstSavings=3600000,useDaylight=true,transitions=242,lastRule=java.util.SimpleTimeZone[id=Europe/London,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=8,WEEK_OF_YEAR=37,WEEK_OF_MONTH=2,DAY_OF_MONTH=12,DAY_OF_YEAR=255,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=27,SECOND=21,MILLISECOND=348,ZONE_OFFSET=0,DST_OFFSET=3600000]";

    int timeStart=calendarAsString.indexOf("time=")+5;
    int timeEnd=calendarAsString.indexOf(',');
    String timeStr=calendarAsString.substring(timeStart, timeEnd);
    long timeInMillis=Long.parseLong(timeStr);

    int timezoneIdStart=calendarAsString.indexOf("\"")+1;
    int timezoneIdEnd=calendarAsString.indexOf("\",");
    String timeZoneStr=calendarAsString.substring(timezoneIdStart, timezoneIdEnd);

    System.out.println("time="+timeInMillis+" zone="+timeZoneStr);
    Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone(timeZoneStr));
    calendar.setTimeInMillis(timeInMillis);

    System.out.println(calendarAsString);
    System.out.println(calendar);

或者您可以使用正则表达式来代替

    String regex="time=([0-9]*),.*ZoneInfo\\[id=\"([^\"]*)\"";
    Pattern pattern=Pattern.compile(regex);
    Matcher matcher=pattern.matcher(calendarAsString);
    matcher.find();
    timeStr=matcher.group(1);
    timeInMillis=Long.parseLong(timeStr);
    timeZoneStr=matcher.group(2);
    System.out.println("time="+timeInMillis+" zone="+timeZoneStr);
    calendar=Calendar.getInstance(TimeZone.getTimeZone(timeZoneStr));
    calendar.setTimeInMillis(timeInMillis);
    System.out.println(calendar);

注意:如果你只想要日历的Date值,你可以从timeInMillis构造它,而不必重建整个GregorianCalendar对象(如果你不想要,也不必找到时区)。

    Date date=new Date(timeInMillis);

答案 1 :(得分:1)

其他答案太复杂或错误。以下内容将为您提供自纪元以来的毫秒,这是一个通用时间戳,您可以轻松转换为大多数时间表示类,包括CalendarDate

Pattern gregorianPattern = Pattern.compile("^java.util.GregorianCalendar\\[time=(\\d+).*"); 

Matcher matcher = gregorianPattern.matcher(param);
if(matcher.matches()) {
    return Long.parseLong(matcher.group(1));
}

答案 2 :(得分:-1)

GregorianCalendar g=new GregorianCalendar(1975, 5, 7);
    Date d=g.getTime();
    System.out.println(g.toString());
    SimpleDateFormat formatter=new SimpleDateFormat("yyyy MM dd"); 
    System.out.println(formatter.format(d));

这是从GregorianCalendar获取日期的方法。我希望这会对你有所帮助

为此添加更多内容,您可以使用该格式检索所需的任何信息。这只是提供正确格式的问题。

例如:
添加z或Z可为您提供时区信息

"yyyy MM dd z" - 2014 10 12 PDT
"yyyy MM dd Z" - 2014 10 12 -0700

添加'T'会产生如下结果:

"yyyy-MM-dd'T'HH:mm:ss.sssZ" - 2014-10-12T14:23:51.890+0530

在此HH中表示24小时格式的小时数mm分ss秒sss毫秒。