【问题标题】:How to convert Gregorian string to Gregorian Calendar?如何将公历字符串转换为公历?
【发布时间】:2014-11-06 13:57:40
【问题描述】:

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

例如我/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]

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

【问题讨论】:

  • 你不能这样。你可以把String当成JsonString
  • @DeiAndrei GregorianCalendar 对象不是简单的,也请阅读docs.oracle.com/javase/7/docs/api/java/util/…
  • 我误读了这个问题,我深表歉意。
  • 祝你好运!这不是标准格式,据我所知很接近,而只是 toString 转储或类似的格式。您将不得不编写临时代码来解析它。 (在你工作时说一首格里高利圣歌可能会有所帮助。)
  • 仅通过转换或解析是否有一个简单的解决方案?

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


【解决方案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】:

您可以在输入字符串中找到时间并将其转换为公历。然后,您必须按照 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);

【讨论】:

    【解决方案3】:
    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 毫秒。

    【讨论】:

    • 这能回答原始问题吗?
    • 这里没有解释如何从问题中描述的原始输入字符串中检索日期
    猜你喜欢
    • 2015-11-22
    • 2014-11-09
    • 2014-11-27
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多