如何将公历字符串转换为公历?
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
当成Json
String
。
@DeiAndrei GregorianCalendar
对象不是简单的,也请阅读docs.oracle.com/javase/7/docs/api/java/util/…
我误读了这个问题,我深表歉意。
祝你好运!这不是标准格式,据我所知很接近,而只是 toString 转储或类似的格式。您将不得不编写临时代码来解析它。 (在你工作时说一首格里高利圣歌可能会有所帮助。)
仅通过转换或解析是否有一个简单的解决方案?
【参考方案1】:
其他答案太复杂或错误。以下将为您提供 自纪元以来的毫秒数,这是一个通用时间戳,您可以轻松地将其转换为大多数时间表示类,包括 Calendar
或 Date
:
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 毫秒。
【讨论】:
这能回答原始问题吗? 这里没有解释如何从问题中描述的原始输入字符串中检索日期以上是关于如何将公历字符串转换为公历?的主要内容,如果未能解决你的问题,请参考以下文章