我不想将字符串Calendar Object(calendar.toString())转换为日历对象 . 我尝试了这个解决方案,但它在控制台中显示当天的日期'12 -05-2017'不是'02 -02-2017'
字符串日历对象格式:
java.util.GregorianCalendar [time = 1485993600000,areFieldsSet = true,areAllFieldsSet = true,lenient = true,zone = sun.util.calendar.ZoneInfo [id =“Africa / Casablanca”,offset = 0,dstSavings = 3600000,useDaylight =真,过渡= 102,lastRule = java.util.SimpleTimeZone中[ID =非洲/卡萨布兰卡,偏移= 0,dstSavings = 3600000,useDaylight =真,startYear = 0,STARTMODE = 2,startMonth = 2,朝九特派= -1, startDayOfWeek = 1,开始时间= 7200000,startTimeMode = 0,endMode = 2,endMonth = 9,endday指定= -1,一个endDayOfWeek = 1,结束时间= 10800000,endTimeMode = 0]],Firstdayofweek可= 2,minimalDaysInFirstWeek = 4,ERA = 1 ,YEAR = 2017,月= 1,WEEK_OF_YEAR = 5,WEEK_OF_MONTH = 1,DAY_OF_MONTH = 2,DAY_OF_YEAR = 33,DAY_OF_WEEK = 5,DAY_OF_WEEK_IN_MONTH = 1,AM_PM = 0,HOUR = 0,HOUR_OF_DAY = 0,MINUTE = 0,SECOND = 0,微差= 0,ZONE_OFFSET = 0,DST_OFFSET = 0]
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(new Date("2017/02/02"));
System.out.println("calendar : "+calendar.getTime());
try {
GregorianCalendar gc = new GregorianCalendar();
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
System.out.println("calendar : "+calendar.getTime());
gc.setTimeZone(TimeZone.getTimeZone(calendar.toString()));
System.out.println("tme zone : "+gc.getTimeZone());
System.out.println("calendar : "+calendar.getTime());
System.out.println("calendar : "+calendar.toString());
System.out.println(formatter.format(gc.getTime()));
}
catch(Exception e) {
//If exception, return server TimeStamp
}
请帮忙
4 回答
如果那是我,我会查看
Calendar
和GregorianCalendar
的所有设置者,看看我是否认为我可以从字符串中提取设置者所需的值 . “time = 1485993600000”应该为您提供最重要的信息,时间,并且您可以将其输入setTimeInMillis()
. 你应该能够从“非洲/卡萨布兰卡”中获得一个时区 . 等等 . 您可以使用正则表达式从字符串中提取字段 .你可能不得不忍住所有案件 . 您的特定
GregorianCalendar
似乎包含sun.util.calendar.ZoneInfo
和java.util.SimpleTimeZone
;我不知道是否总是如此,也不知道其他可能性 .对您的尝试进行严格测试很简单:只需在新构建的实例上再次调用
toString()
,看看是否得到相同的字符串 . 如果您接受一些差异并且需要确定实际差异是否在您决定接受的范围内,则会遇到困难 .或者真的,如果我能避免它,我不想打扰 . 我会看是否能找到一个更简单的任务或更简单的方法来获得你真正想要获得的东西 . 正如我在评论中所说,可以使用
java.time.LocalDate
而不是GregorianCalendar
.LocalDate.parse()
将很容易解析LocalDate.toString()
中的字符串,问题解决了 . 只是举一个例子来看待它 .在您的代码中,您有两个单独的
GregorianCalendar
对象 - 一个名为calendar
,一个名为gc
. 您将一个日历对象设置为所需的日期,然后打印出另一个 .谢谢@Ole,我终于找到了解决方案并且它有效 .
java.time
您使用的是可怕的旧类,现在被更优秀的java.time类所取代 .
实例化
LocalDate
. LocalDate类表示没有时间且没有时区的仅日期值 .要生成标准ISO 8601格式的字符串,请调用
toString
.对于其他格式,请使用
DateTimeFormatter
类 .你的问题不明确 . 如果问题是您的代码被传递给
GregorianCalendar
对象,请将其转换为java.time.ZonedDateTime
. 调用添加到旧类的新转换方法 .提取所需的仅限日期的值,作为
LocalDate
.关于java.time
java.time框架内置于Java 8及更高版本中 . 这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date,Calendar和SimpleDateFormat .
现在位于maintenance mode的Joda-Time项目建议迁移到java.time类 .
要了解更多信息,请参阅Oracle Tutorial . 并搜索Stack Overflow以获取许多示例和解释 . 规格是JSR 310 .
从哪里获取java.time类?
Java SE 8,Java SE 9,以及之后
内置 .
具有捆绑实现的标准Java API的一部分 .
Java 9增加了一些小功能和修复 .
Java SE 6和Java SE 7
大部分java.time功能都在ThreeTen-Backport中反向移植到Java 6&7 .
Android
ThreeTenABP项目专门针对Android调整ThreeTen-Backport(如上所述) .
见How to use ThreeTenABP… .
ThreeTen-Extra项目使用其他类扩展java.time . 该项目是未来可能添加到java.time的试验场 . 你可能会发现一些有用的这里的类如Interval,YearWeek,YearQuarter和more .