我试图解析实际日期时出错日期

时间:2017-06-10 06:00:56

标签: java android date datetime datetime-parsing

我的实际日期格式为:

  

6月10日星期六上午11:18

我想将此格式转换为yyyy-MM-dd HH:mm:ss

为此,我尝试使用以下代码解析输入字符串:

SimpleDateFormat format = new SimpleDateFormat("EEEE, MMMM dd HH:mm aa", Locale.ENGLISH);
Log.d("date:","date is:"+format.parse(resultstr));

该行的输出给出:

  

Wed Jun 10 00:00:00 GMT + 05:30 1970

但我不知道为什么它会给出这个值而不是实际值。

4 个答案:

答案 0 :(得分:2)

java.time.MonthDay

您可以将日期部分解析为MonthDay个对象,将时间部分解析为LocalTime

我没有尝试过此代码,但可能会有效。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEEE, MMMM dd HH:mm a" , Locale.US ) ;
String input = "Saturday, June 10 11:18 AM" ;
MonthDay md = MonthDay.parse( input , f ) ;
LocalTime lt = LocalTime.parse( input , f ) ;

指定获得LocalDate的年份。

LocalDate ld = md.atYear( 2017 );

指定用作此日期时间的上下文的时区。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

答案 1 :(得分:2)

当有人在Android中询问有关日期和/或时间的问题时,我建议您查看ThreeTenABP库。它为Android提供了现代Java日期和时间类。这些通常比过时的DateSimpleDateFormatCalendar更加友好。

在你的情况下我做得更多。你没有一年。您可以使用不太好的旧GregorianCalendar来设置一年,但如果选择哪一年的要求变得有点复杂,您更愿意使用现代课程。这是一个例子,我找到了最新的一年,其中星期几匹配字符串中的星期几,仅作为示例,因为这可能与您的确切要求不符。我首先将字符串解析为TemporalAccessor,我认为这是用于创建我们想要的对象的中间形式。从这一点开始,我每周,每月和每一天都会找到有效的年份。从这些部分我们把日期放在一起,从解析结果中我们花时间(11:18)并构建最终结果的LocalDateTime

    String actualDateString = "Saturday, June 10 11:18 AM";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE, MMMM dd HH:mm a", Locale.ENGLISH);

    // Step one, porse
    TemporalAccessor parsed = formatter.parse(actualDateString);
    // Use day of week, month and day and find a year that matches
    DayOfWeek actualDayOfWeek = DayOfWeek.from(parsed);
    MonthDay actualMonthDay = MonthDay.from(parsed);
    int cancidateYear = Year.now(ZoneId.systemDefault()).getValue();
    while (! actualMonthDay.atYear(cancidateYear).getDayOfWeek().equals(actualDayOfWeek)) {
        cancidateYear--;
    }

    // Final step, put the date and time together from the pieces
    LocalDateTime dateTime = LocalDateTime.of(actualMonthDay.atYear(cancidateYear), 
                                              LocalTime.from(parsed));

    System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

打印:

2017-06-10 11:18:00

如果您希望明年的某一天匹配的下一年,只需在循环中计数而不是倒数。如果需要,现代课程可以很好地用于确定年份的更精细的算法。

谢谢,雨果,帮助我简化(再次)。

链接

答案 2 :(得分:0)

如评论中所述,您缺少年份值,因此您将获得默认值1970(unix epoch value)。您可以使用Calendar在解析后设置一年。

Calendar cal = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("EEEE, MMMM dd HH:mm aa", Locale.ENGLISH);
cal.setTime(format.parse("Saturday, June 10 11:18 AM"));
cal.set(Calendar.YEAR, 2017);
System.out.println("date is ["+cal.getTime() +"]");

答案 3 :(得分:0)

试试这个,它对我有用:

        SimpleDateFormat sdf = new SimpleDateFormat("EEEE, MMMM dd HH:mm aa");
        Log.d("date:","date is:"+sdf.format(new java.util.Date()));