我不想将字符串Calendar Object(calendar.toString())转换为日历对象。 我尝试了这个解决方案,但它在控制台中显示了当天的日期' 12-05-2017'不是' 02-02-2017'
字符串日历对象格式:
java.util.GregorianCalendar中[时间= 1485993600000,areFieldsSet =真,areAllFieldsSet =真,宽大=真,区= sun.util.calendar.ZoneInfo [ID ="非洲/卡萨布兰卡",偏移= 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
}
请帮助
答案 0 :(得分:1)
如果那是我,我会查看Calendar
和GregorianCalendar
的所有设置者,看看我是否认为我可以从字符串中提取设置者所需的值。 “time = 1485993600000”应该为您提供最重要的信息和时间,您可以将其提供给setTimeInMillis()
。你应该能够从“非洲/卡萨布兰卡”中获得一个时区。等等。您可以使用正则表达式从字符串中提取字段。
你可能不得不忍住所有案件。您的特定GregorianCalendar
似乎包含sun.util.calendar.ZoneInfo
和java.util.SimpleTimeZone
;我不知道是否总是如此,也不知道其他可能性。
对您的尝试进行严格测试很简单:只需在新构建的实例上再次调用toString()
,看看是否得到相同的字符串。如果您接受一些差异并且您需要确定实际差异是否在您决定接受的范围内,则会遇到困难。
或者真的,如果我能避免它,我不想打扰。我会看是否能找到一个更简单的任务或更简单的方法来获得你真正想要获得的东西。正如我在评论中所说,可以使用java.time.LocalDate
代替GregorianCalendar
。 LocalDate.parse()
将很容易从LocalDate.toString()
解析字符串,问题就解决了。只是举一个另一种看待它的方式的例子。
答案 1 :(得分:1)
在您的代码中,您有两个单独的GregorianCalendar
个对象 - 一个名为calendar
,另一个名为gc
。您将一个日历对象设置为您想要的日期,然后打印出另一个日历对象。
答案 2 :(得分:1)
谢谢@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) {
}
答案 3 :(得分:0)
你正在使用可怕的旧类,现在被更优秀的java.time类所取代。
实例化LocalDate
。 LocalDate
类表示没有时间且没有时区的仅限日期的值。
LocalDate ld = LocalDate.parse( "2017-02-02" ) ;
要生成标准ISO 8601格式的字符串,请调用toString
。
String output = ld.toString() ;
2017年2月2日
对于其他格式,请使用DateTimeFormatter
类。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
String output = ld.format( f ) ;
2017年2月2日
您的问题不明确。如果问题是您的代码被传递给GregorianCalendar
对象,请将其转换为java.time.ZonedDateTime
。调用添加到旧类的新转换方法。
if( myCalendar instanceOf GregorianCalendar ) {
ZonedDateTime zdt = myCalendar.toZonedDateTime() ;
}
以LocalDate
。
LocalDate ld = zdt.toLocalDate() ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。