我的实际日期格式为:
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
但我不知道为什么它会给出这个值而不是实际值。
答案 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日期和时间类。这些通常比过时的Date
,SimpleDateFormat
和Calendar
更加友好。
在你的情况下我做得更多。你没有一年。您可以使用不太好的旧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()));