从完整的日历日期格式中获取日期名称

Get day name from full calender date format

如何从这种日期格式 "Wed Jan 30 00:00:00 GMT+02:00 2019"

中获取像(星期三 - 星期四)这样的名称

您可以使用 SimpleDateFormat 来表示全天名称的格式部分是 EEEE。 希望对您有所帮助!

您需要先使用 SimpleDateFormatString 解析为 Calendar 对象:

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
try {
    cal.setTime(sdf.parse("Wed Jan 30 00:00:00 GMT+02:00 2019"));
} catch (ParseException e) {
    // Log invalid date format
}

然后从您的 Calendar 对象中提取日期:

String day = cal.getDisplayName(Calendar.DAY_OF_WEEK,Calendar.LONG,Locale.ENGLISH);

## 在这里,我附上了一个方法,它会给你预期的输出##

public void dayName(){
    String weekDay,time;
    SimpleDateFormat dayFormat = new SimpleDateFormat("EEEE MMM dd HH:mm", Locale.US);
    SimpleDateFormat dayFormat1 = new SimpleDateFormat("hh:mm yyyy", Locale.US);
    dayFormat.setTimeZone(TimeZone.getTimeZone("ITC"));
    dayFormat1.setTimeZone(TimeZone.getTimeZone("GMT"));
        Calendar calendar = Calendar.getInstance();
        weekDay = dayFormat.format(calendar.getTime());
        time=dayFormat1.format(calendar.getTime());
        Log.e(TAG, "dayName: "+weekDay+" GMT+"+time );// out put looks like : Tuesday Jan 29 17:58 GMT+05:58 2019

}
  • 我用过两个时区,分别是 ITC 和 GMT

java.time

看来你得到的是java.util.Dateclass的一个实例。那是一个设计糟糕的 class,已经过时了,所以首先要看看你是否可以避免这种情况,并从 java.time 获得一个 class 的实例,现代的 Java日期和时间 API,而不是。

但是,如果您从遗留 API 中获得了 Date 并且您现在无法更改或不想更改,那么首先要做的就是将其转换为现代 Instant 然后从那里执行进一步的转换。以下代码段使用 ThreeTenABP,更多内容见下文。

    Date yourOldfashionedDate = getFromLegacyApi();

    Instant modernInstant = DateTimeUtils.toInstant(yourOldfashionedDate);
    String dayName = modernInstant.atZone(ZoneId.systemDefault())
            .getDayOfWeek()
            .getDisplayName(TextStyle.FULL, Locale.ENGLISH);

    System.out.println("Day name is " + dayName);

给出问题日期的输出:

Day name is Wednesday

如果你得到的是一个String(可能是某个时候从Date.toString返回的字符串),你需要先解析它:

    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);

    String dateString = "Wed Jan 30 00:00:00 GMT+02:00 2019";
    ZonedDateTime dateTime = ZonedDateTime.parse(dateString, dateFormatter);
    String dayName = dateTime.getDayOfWeek()
            .getDisplayName(TextStyle.FULL, Locale.ENGLISH);

你看最后一点跟之前一模一样

问题:我可以在 Android 上使用 java.time 吗?

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

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26),现代 API 是内置的。仅在这种情况下使用 yourOldfashionedDate.toInstant() 而不是 DateTimeUtils.toInstant(yourOldfashionedDate).
  • 在 Java 6 和 7 中获取 ThreeTen Backport,现代 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接