从API响应中以String格式格式化日期和时间

时间:2017-06-22 17:19:25

标签: java android date time formatting

我正在使用Guardian API来获取有关足球的最新新闻。

我想向用户显示日期和时间信息,但不会以API的格式向我显示。

在查询http://content.guardianapis.com/search?page-size=10&section=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对象。

2 个答案:

答案 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 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.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_PauloEurope/Berlin。 避免使用3个字母的缩写(例如CSTPST),因为它们是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