更改android中的日期字符串格式

时间:2012-05-03 06:51:41

标签: android

我从SAX解析日期字符串解析如下:星期三,2012年4月18日07:55:29 +0000

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

我该怎么做?

7 个答案:

答案 0 :(得分:122)

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);

答案 1 :(得分:16)

这样做:

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";

答案 2 :(得分:5)

从官方文档中,在新的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

答案 3 :(得分: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);

答案 4 :(得分: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

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

java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

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

链接

答案 5 :(得分:0)

这适用于我,使用 SimpleDateFormat 日历

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());

答案 6 :(得分: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);