2017-06-22 31 views
2

我正在使用Guardian API获取有关足球的最新新闻。从API响应中以字符串格式格式化日期和时间

我想向用户显示日期和时间信息,但不是以API将它引回给我的格式。

当查询http://content.guardianapis.com/search?page-size=10&section=football&show-tags=contributor&api-key=test后请求webPublicationDate我得到这种格式的响应:

2017-06-22T16:18:04Z

现在,我想在这个日期和时间信息格式: 例如Jun 21,2017 and 16:18 or 4:18 pm

虽然我基本上知道正确格式化Date对象为这种格式:

/** 
* Return the formatted date string (i.e. "Mar 3, 1984") from a Date object. 
*/ 
private String formatDate(Date dateObject) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("LLL dd, yyyy"); 
    return dateFormat.format(dateObject); 
} 

/** 
* Return the formatted date string (i.e. "4:30 PM") from a Date object. 
*/ 
private String formatTime(Date dateObject) { 
    SimpleDateFormat timeFormat = new SimpleDateFormat("h:mm a"); 
    return timeFormat.format(dateObject); 
} 

但我似乎无法让我进入Date对象的响应转换。

+1

而且重复的:https://开头计算器。 com/q/2201925和https://stackoverflow.com/q/31090946 –

回答

0

您可以格式化文字是这样的:

package com.mkyong.date; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class TestDateExample5 { 

public static void main(String[] argv) { 

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
    String dateInString = "2014-10-05T15:23:01Z"; 

    try { 

     Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000")); 
     System.out.println(date); 

     System.out.println("time zone : " + TimeZone.getDefault().getID()); 
     System.out.println(formatter.format(date)); 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

} 

} 

ž后缀是指UTC,java.util.SimpleDateFormat不能正确分析它,你需要用“+0000”来取代标z 。从这里

代码:https://www.mkyong.com/java/how-to-convert-string-to-date-java/

0

,而不是与SimpleDateFormat直接合作(在这种老的API有lots of problemsdesign issues),你可以使用ThreeTen Backport,对Java 8的新的日期/时间类有很大反向移植。要在Android中使用它,您还需要ThreeTenABP(有关如何使用它的更多信息,请参阅here)。

要使用的主要类是org.threeten.bp.ZonedDateTime(可以解析日期/时间输入)和org.threeten.bp.format.DateTimeFormatter(用于控制输出格式)。

如果你正在阅读这个领域(2017-06-22T16:18:04Z)为String,你可以创建一个ZonedDateTime这样的:

ZonedDateTime z = ZonedDateTime.parse("2017-06-22T16:18:04Z"); 

如果你已经有了一个java.util.Date对象,你可以使用org.threeten.bp.DateTimeUtilsorg.threeten.bp.ZoneOffset转换它:

Date date = // get java.util.Date 
ZonedDateTime z = DateTimeUtils.toInstant(date).atZone(ZoneOffset.UTC); 

在结束时,ZonedDateTime对象将具有webPublicationDate值。

要获得不同的输出格式,只需为每种格式创建一个DateTimeFormatter即可。在下面的例子中,我也用java.util.Locale类,以确保月份名称都是英文:

// for Mar 3, 1984 
DateTimeFormatter f1 = DateTimeFormatter.ofPattern("MMM d, yyyy", Locale.ENGLISH); 
// for 4:40 PM 
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH); 
// for 16:18 
DateTimeFormatter f3 = DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH); 

System.out.println(f1.format(z)); // Jun 22, 2017 
System.out.println(f2.format(z)); // 4:18 PM 
System.out.println(f3.format(z)); // 16:18 

输出是:

2017年6月22日
下午4时18
16 :18

请注意,它使用UTC时区(Z2017-06-22T16:18:04Z)。如果你想显示在另一个时区的日期和时间,只需使用org.threeten.bp.ZoneId类:

System.out.println(f3.format(z.withZoneSameInstant(ZoneId.of("Europe/London")))); // 17:18 

输出是17:18(becase的伦敦夏季时间了)。

请注意,API使用IANA timezones names(始终格式为Continent/City,如America/Sao_PauloEurope/Berlin)。 避免使用3字母缩写(如CST或),因为它们是ambiguous and not standard。要找到更适合每个地区的时区,请使用ZoneId.getAvailableZoneIds()方法,并检查哪一个最适合您的用例。


如果你不希望其他依赖添加到您的项目并使用SimpleDateFormat,你做同样的事情(创建一个解析器和3输出格式化,并使用英语语言环境)。另外不要忘记设置时区 - 我在下面使用UTC,但您可以将其更改为您想要的任何时区。

// parse date 
String dateInString = "2017-06-22T16:18:04Z"; 
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); 
Date date = parser.parse(dateInString); 

// create output formatters (set timezone to UTC) 
TimeZone utc = TimeZone.getTimeZone("UTC"); 
SimpleDateFormat s1 = new SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH); 
s1.setTimeZone(utc); 
SimpleDateFormat s2 = new SimpleDateFormat("h:mm a", Locale.ENGLISH); 
s2.setTimeZone(utc); 
SimpleDateFormat s3 = new SimpleDateFormat("HH:mm", Locale.ENGLISH); 
s3.setTimeZone(utc); 

System.out.println(s1.format(date)); 
System.out.println(s2.format(date)); 
System.out.println(s3.format(date)); 

的输出将是相同的:

2017年6月22日
下午4点18
16:18