39

我从 SAX 解析中获取日期字符串,如下所示:Wed, 18 Apr 2012 07:55:29 +0000

现在,我希望这个字符串为:2012 年 4 月 18 日 01:25 PM

我怎样才能做到这一点?

4

7 回答 7

142
SimpleDateFormat format = new SimpleDateFormat("MMM dd,yyyy  hh:mm a");
String date = format.format(Date.parse("Your date string"));

更新 :-

如上,Date.parse("Your date string");已弃用。

String strCurrentDate = "Wed, 18 Apr 2012 07:55:29 +0000";
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss Z");
Date newDate = format.parse(strCurrentDate);

format = new SimpleDateFormat("MMM dd,yyyy hh:mm a");
String date = format.format(newDate);
于 2012-05-03T06:53:26.027 回答
20

这将做到:

public static String formateDateFromstring(String inputFormat, String outputFormat, String inputDate){

    Date parsed = null;
    String outputDate = "";

    SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, java.util.Locale.getDefault());
    SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, java.util.Locale.getDefault());

    try {
        parsed = df_input.parse(inputDate);
        outputDate = df_output.format(parsed);

    } catch (ParseException e) { 
        LOGE(TAG, "ParseException - dateFormat");
    }

    return outputDate;

}

例子:

String date_before = "1970-01-01";
String date_after = formateDateFromstring("yyyy-MM-dd", "dd, MMM yyyy", date_before);

输出:

date_after = "01, Jan 1970";
于 2013-10-17T20:34:19.217 回答
6

从官方文档中,在新的 API (18+) 中你应该实现这个:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US);
String time=sdf.format(new Date());

文档:http: //developer.android.com/reference/java/text/SimpleDateFormat.html

于 2014-05-14T04:57:42.707 回答
2

最简单的解决方案是使用DateFormat的 getter 方法: getDateTimeInstance DateFormat 对象格式日期如下:1969 年 12 月 31 日下午 4:00:00,但是在 4:00 之后还有那些额外的零

Date date = new Date();
String fDate = DateFormat.getDateTimeInstance().format(date);
System.out.println(fDate);
于 2015-07-16T21:03:13.727 回答
2

这对我有用,使用SimpleDateFormatCalendar

String originDate = "Wed, 18 Apr 2012 07:55:29 +0000";
SimpleDateFormat formatIn = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss Z");
SimpleDateFormat formatOut = new SimpleDateFormat("MMM dd,yyyy hh:mm a");
Calendar calendar = Calendar.getInstance();
calendar.setTime(formatIn.parse(originDate));

String newDate = formatOut.format(calendar.getTime());
于 2017-04-06T15:34:41.073 回答
1

java.time 和 ThreeTenABP

这个问题的现代答案已经过期了。当这个问题在 2012 年被问到时,使用SimpleDateFormat和/或DateFormat其他答案是正确的,即使这些课程一直很麻烦。几年后,它们被现代 Java 日期和时间 API 的 java.time 所取代,坦率地说,我发现使用它要好得多。所以我正在这样做。

我建议您将转换分为两个操作。在您的程序中,不要将日期和时间保留为字符串。将它们保留为适当的日期时间对象。因此,当从 SAX 解析时,还将日期时间字符串解析为OffsetDateTime立即。稍后当您需要向用户显示日期和时间(或将其传输到另一个系统)时,将其转换为用户的时区并将其格式化为用于该目的的适当字符串。

解析成 OffsetDateTime

您得到的字符串符合 RFC 1123 格式。java.time 有一个内置的格式化程序,这很好,因为它使我们免于构建自己的格式化程序。

    String stringFromSaxParsing = "Wed, 18 Apr 2012 07:55:29 +0000";

    OffsetDateTime dateTime = OffsetDateTime.parse(
            stringFromSaxParsing, DateTimeFormatter.RFC_1123_DATE_TIME);

    System.out.println(dateTime);

此片段的输出是:

2012-04-18T07:55:29Z

转换为用户的时区和格式

    DateTimeFormatter wantedFormatter = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm a", Locale.ENGLISH);

    String formatted = dateTime.atZoneSameInstant(ZoneId.systemDefault())
            .format(wantedFormatter);

    System.out.println(formatted);

我在亚洲/科伦坡时区运行它并得到了想要的:

2012 年 4 月 18 日 01:25 PM

问题:java.time 不需要 Android API 级别 26 吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接

于 2020-01-14T03:02:39.263 回答
0

这是我的解决方案,可能对您有所帮助

 public static void setFormattedEventDate(TextView textView,String start_date , String end_date){
        SimpleDateFormat formatIn = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat formatOut = new SimpleDateFormat("dd MMM");
        try {
            Date startDate = formatIn.parse(start_date);
            Date endDate = formatIn.parse(end_date);
            String outputStartDate = formatOut.format(startDate);
            String outputEndDate = formatOut.format(endDate);
            textView.setText(outputStartDate+" - "+outputEndDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }

然后像这样调用这个方法

setFormattedEventDate(contentViewHolder.rowItemEventBinding.txtCompetitionDate, event.datestart, event.dateend);
于 2021-03-05T20:15:58.430 回答