How to convert Gregorian string to Gregorian Calendar?

后端 未结 3 1140
醉话见心
醉话见心 2020-12-19 22:51

I have to compute something based on the Calendar\'s date, but I am receiving the complete Gregorian Calendar\'s String value.

Eg i/p received {may be - \"new

3条回答
  •  余生分开走
    2020-12-19 23:34

    You could find the time in the input string and convert it to a Gregorian Calendar. Then you would have to set its timezone as specified in the ZoneInfo field. Something like this might work:

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

    or you can use a regular expression to do it, instead

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

    Note: if you just want the calendar's Date value, you can construct it from the timeInMillis, without having to reconstruct the whole GregorianCalendar object (and without having to find the timezone if you don't want to).

        Date date=new Date(timeInMillis);
    

提交回复
热议问题