首页 文章

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

提问于
浏览
-1

我不想将字符串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 回答

  • 1

    如果那是我,我会查看 CalendarGregorianCalendar 的所有设置者,看看我是否认为我可以从字符串中提取设置者所需的值 . “time = 1485993600000”应该为您提供最重要的信息,时间,并且您可以将其输入 setTimeInMillis() . 你应该能够从“非洲/卡萨布兰卡”中获得一个时区 . 等等 . 您可以使用正则表达式从字符串中提取字段 .

    你可能不得不忍住所有案件 . 您的特定 GregorianCalendar 似乎包含 sun.util.calendar.ZoneInfojava.util.SimpleTimeZone ;我不知道是否总是如此,也不知道其他可能性 .

    对您的尝试进行严格测试很简单:只需在新构建的实例上再次调用 toString() ,看看是否得到相同的字符串 . 如果您接受一些差异并且需要确定实际差异是否在您决定接受的范围内,则会遇到困难 .

    或者真的,如果我能避免它,我不想打扰 . 我会看是否能找到一个更简单的任务或更简单的方法来获得你真正想要获得的东西 . 正如我在评论中所说,可以使用 java.time.LocalDate 而不是 GregorianCalendar . LocalDate.parse() 将很容易解析 LocalDate.toString() 中的字符串,问题解决了 . 只是举一个例子来看待它 .

  • 1

    在您的代码中,您有两个单独的 GregorianCalendar 对象 - 一个名为 calendar ,一个名为 gc . 您将一个日历对象设置为所需的日期,然后打印出另一个 .

  • 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) {
    
                 }
    
  • 0

    java.time

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

    实例化 LocalDate . LocalDate类表示没有时间且没有时区的仅日期值 .

    LocalDate ld = LocalDate.parse( "2017-02-02" ) ;
    

    要生成标准ISO 8601格式的字符串,请调用 toString .

    String output = ld.toString() ;
    

    2017-02-02

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

    DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
    String output = ld.format( f ) ;
    

    02-02-2017

    你的问题不明确 . 如果问题是您的代码被传递给 GregorianCalendar 对象,请将其转换为 java.time.ZonedDateTime . 调用添加到旧类的新转换方法 .

    if( myCalendar instanceOf GregorianCalendar ) {
        ZonedDateTime zdt = myCalendar.toZonedDateTime() ;
    }
    

    提取所需的仅限日期的值,作为 LocalDate .

    LocalDate ld = zdt.toLocalDate() ;
    

    关于java.time

    java.time框架内置于Java 8及更高版本中 . 这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat .

    现在位于maintenance modeJoda-Time项目建议迁移到java.time类 .

    要了解更多信息,请参阅Oracle Tutorial . 并搜索Stack Overflow以获取许多示例和解释 . 规格是JSR 310 .

    从哪里获取java.time类?

    ThreeTen-Extra项目使用其他类扩展java.time . 该项目是未来可能添加到java.time的试验场 . 你可能会发现一些有用的这里的类如IntervalYearWeekYearQuartermore .

相关问题