如何将公历字符串转换为公历?

Posted

技术标签:

【中文标题】如何将公历字符串转换为公历?【英文标题】: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 转储或类似的格式。您将不得不编写临时代码来解析它。 (在你工作时说一首格里高利圣歌可能会有所帮助。) 仅通过转换或解析是否有一个简单的解决方案? 【参考方案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 毫秒。

【讨论】:

这能回答原始问题吗? 这里没有解释如何从问题中描述的原始输入字符串中检索日期

以上是关于如何将公历字符串转换为公历?的主要内容,如果未能解决你的问题,请参考以下文章

在 impala 中将儒略日期转换为公历日期

WPS表格怎么将公历转化成农历日期?

使用非公历日历创建UNNotification

php 公历农历互相转换

公历和农历转换的JS代码<转>

PHP阴历阳历转换