在java中将日历字符串转换为日历对象

在java中将日历字符串转换为日历对象,java,parsing,calendar,gregorian-calendar,Java,Parsing,Calendar,Gregorian Calendar,我不想将字符串Calendar Object Calendar.toString转换为Calendar Object。 我尝试了此解决方案,但控制台中显示的日期是“2017年5月12日”,而不是“2017年2月2日” 字符串日历对象格式: java.util.GregorianCalendar[time=1485993600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo

我不想将字符串Calendar Object Calendar.toString转换为Calendar Object。 我尝试了此解决方案,但控制台中显示的日期是“2017年5月12日”,而不是“2017年2月2日”

字符串日历对象格式:

java.util.GregorianCalendar[time=1485993600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=Africa/Casablanca,offset=0,DSTSAVAINGS=3600000,useDaylight=true,transitions=102,lastRule=java.util.SimpleTimeZone[id=Africa/Casablanca,offset=0,DStSaves=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=10800000,endTimeMode=0]],周的第一天=2,周的第一天=4,纪元=1,年=2017,月=1,年的周=5,月的周=1,月的日=2,年的日=33,周的日=5,月的周的日=1,上午下午=0,小时=0,日的小时=0,分钟=0,秒=0,毫秒=0,分区偏移=0,DST偏移=0]


如果是我,我会查看Calendar和GregorianCalendar的所有设置器,看看是否可以从字符串中提取设置器所需的值。“time=1485993600000”应该给你最重要的信息,时间,你可以把它输入setTimeInMillis。你应该能够从“非洲/卡萨布兰卡”中获取时区。等等。你可能可以使用正则表达式从字符串中提取字段

您可能不得不接受不涵盖所有情况的情况。您特定的GregorianCalendar似乎包含一个sun.util.calendar.ZoneInfo和一个java.util.SimpleTimeZone;我不知道是否总是这样,也不知道还有什么其他可能性

对您的尝试进行严格的测试很容易:只需在新构造的实例上再次调用toString,看看是否得到相同的字符串。如果您接受一些差异,并且需要确定实际差异是否在您决定接受的范围内,那么困难就来了


或者说真的,如果我能避免它,我不想麻烦。我想看看我是否能找到一个更简单的任务或更简单的方法来获取您真正想要获取的内容。正如我在评论中所说的,可以使用java.time.LocalDate而不是GregorianCalendar。LocalDate.parse将很容易地从LocalDate.toString解析字符串,并且解决这个问题已解决。只需给出另一种方法的示例。

在您的代码中,您有两个独立的GregoriaCalendar对象-一个称为calendar,另一个称为gc。您将一个calendar对象设置为所需的日期,然后打印出另一个对象。

谢谢@Ole,我终于找到了解决方案,它可以工作了

             Calendar calendar = Calendar.getInstance();;
             calendar.setTime(new Date("2017/02/02"));
             String[] ds = calendar.toString().split("=");
             String[] ds2 = ds[1].split(",");
             try {
                 Calendar cal = Calendar.getInstance();;
                 DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
                 cal.setTimeInMillis(Long.valueOf(ds2[0]));
                 System.out.println(formatter.format(cal.getTime()));
             }
             catch(Exception e) {

             }
java.time 您正在使用可怕的旧类,这些旧类现在被更优秀的java.time类所取代

实例化LocalDate。该类表示一个只包含日期的值,不包含一天中的时间,也不包含时区

LocalDate ld = LocalDate.parse( "2017-02-02" ) ;
要生成标准ISO 8601格式的字符串,请调用toString

2017-02-02

对于其他格式,请使用DateTimeFormatter类

02-02-2017

您的问题不清楚。如果问题是您的代码被交给了GregorianCalendar对象,请将其转换为java.time.ZonedDateTime。调用添加到旧类中的新转换方法

if( myCalendar instanceOf GregorianCalendar ) {
    ZonedDateTime zdt = myCalendar.toZonedDateTime() ;
}
提取所需的仅日期值,作为LocalDate

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

从哪里获得java.time类

,及以后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 该项目特别针对Android采用了上述Three-Ten Backport。 看见

该项目将Java.Times扩展到其他类。该项目是对Java.Times可能的未来添加的一个试验场。您可以在这里找到一些有用的类,如,,和./P>尝试了什么解决方案?您没有张贴任何代码。啊,不。我会考虑存储时间长和时区信息,可能格式化为字符串,但是。我不打算尝试从日历中解析toStand值…我也建议看看新的java时间API,因为它支持和输出了ISO格式的数量。box@azurefrog我将代码添加到我的postFirst中的问题是Calendar是一个抽象类,GregorianCalendar是使用最广泛的子类对于Calendar对象,您可能有一个具有完全不同的toString方法的不同子类的实例。您正在调用GregoriaCalendar.getInstance,但这是对Calenda的调用


r、 我知道这是一个过于简单的答案:使用java.time.LocalDate而不是GreforianCalendar。LocalDate.parse将很容易解析LocalDate.toString.Sorry、@OleV.V中的字符串。我想我反应过度了。我仍然相信问题的关键在于,他给日历分配了一个值,然后打印了gc,期望他的值神奇地从一个对象转移到另一个对象——这是一个你的答案从未解决过的问题。然而,你的答案确实包含了一些很好的其他信息,这显然有助于引导OP找到正确的答案。我再次为我之前的评论道歉。没有什么不愉快的感觉。
String output = ld.toString() ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
String output = ld.format( f ) ;
if( myCalendar instanceOf GregorianCalendar ) {
    ZonedDateTime zdt = myCalendar.toZonedDateTime() ;
}
LocalDate ld = zdt.toLocalDate() ;