我正在使用Guardian API来获取有关足球的最新新闻。
我想向用户显示日期和时间信息,但不会以API的格式向我显示。
在查询http://content.guardianapis.com/search?page-size=10§ion=football&show-tags=contributor&api-key=test后请求webPublicationDate时,我会收到以下格式的回复:
2017-06-22T16:18:04Z
现在,我想要这种格式的日期和时间信息: 例如 2017年6月21日和 16:18 或 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
对象。
答案 0 :(得分:1)
您可以这样格式化文本:
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();
}
}
}
Z后缀表示UTC,java.util.SimpleDateFormat无法正确解析,您需要将后缀Z替换为“+0000”。
此处的代码:https://www.mkyong.com/java/how-to-convert-string-to-date-java/
答案 1 :(得分:1)
而不是直接使用SimpleDateFormat
(因为这个旧版API有lots of problems和design 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.DateTimeUtils
使用org.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时区(Z
中的2017-06-22T16:18:04Z
)。如果您想在另一个时区显示日期和时间,请使用org.threeten.bp.ZoneId
类:
System.out.println(f3.format(z.withZoneSameInstant(ZoneId.of("Europe/London")))); // 17:18
输出为17:18
(因为伦敦现在是夏季时间)。
请注意,API使用IANA timezones names(始终采用Continent/City
格式,如America/Sao_Paulo
或Europe/Berlin
。
避免使用3个字母的缩写(例如CST
或PST
),因为它们是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