如何从当前语言环境获取日期时间格式字符串,作为 SimpleDateFormat 的参数

How to get the date-time format string from current Locale, as a parameter for SimpleDateFormat

我的 Android 应用程序想要显示日期时间字符串和相应的格式字符串。 它使用 SimpleDateFormat,因为它与旧 Android API 级别兼容。

Calendar calendar=Calendar.getInstance();
formatString=getTheCurrentLocaleDateTimeFormatString();
SimpleDateFormat dateFormat = new SimpleDateFormat(formatString);
localeTimeString= dateFormat.format(calendar.getTimeInMillis());
displayToTheUser(localeTimeString);
displayToTheUser(formatString);

例如用户得到:"Wed, 4 Jul 2001 12:08:56" 和 "EEE, d MMM yyyy HH:mm:ss"

提供的代码片段旨在根据当前区域设置获取日期时间形式,但我不知道如何将其作为格式字符串获取。应该是通过上面的getTheCurrentLocaleDateTimeFormatString()方法计算出来的

我看到有很多格式字符串模式可用。

这是相关的文档页面:

https://developer.android.com/reference/java/text/SimpleDateFormat#examples

由于我想将该格式字符串作为模板显示给用户并将其用作 SimpleDateFormat 的参数,我的问题是:如何获取当前区域设置的日期时间模式格式字符串?

您可以按照以下方式进行:

SimpleDateFormat getTheCurrentLocaleDateTimeFormatString() {
    return (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault());
}

一个测试程序:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat dateFormat = getTheCurrentLocaleDateTimeFormatString();
        String localeTimeString = dateFormat.format(calendar.getTimeInMillis());
        System.out.println(localeTimeString);
    }

    static SimpleDateFormat getTheCurrentLocaleDateTimeFormatString() {
        return (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault());
    }
}

输出:

Sunday, 12 January 2020

[更新]

根据您的评论发布以下代码:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Calendar calendar=Calendar.getInstance();
        String formatString=getTheCurrentLocaleDateTimeFormatString();
        System.out.println(formatString);
        SimpleDateFormat dateFormat = new SimpleDateFormat(formatString);
        String localeTimeString= dateFormat.format(calendar.getTimeInMillis());
        System.out.println(localeTimeString);
    }

    static String getTheCurrentLocaleDateTimeFormatString() {
        return ((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault())).toLocalizedPattern();
    }
}

输出:

EEEE, d MMMM y
Sunday, 12 January 2020

[再次更新]

根据您的另一条评论发布以下代码:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        String formatString = getTheCurrentLocaleDateTimeFormatString();
        System.out.println(formatString);
        SimpleDateFormat dateFormat = new SimpleDateFormat(formatString);
        String localeTimeString = dateFormat.format(calendar.getTimeInMillis());
        System.out.println(localeTimeString);
    }

    static String getTheCurrentLocaleDateTimeFormatString() {
        return ((SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL,
                Locale.getDefault())).toLocalizedPattern();
    }
}

输出:

EEEE, d MMMM y 'at' HH:mm:ss zzzz
Sunday, 12 January 2020 at 20:28:05 Greenwich Mean Time

java.time 和 ThreeTenABP

代码使用 java.time。现代 Java 日期和时间 API 也可以在旧 Android API 关卡上使用。 DateTimeFormatterBuilder.getLocalizedDateTimePattern() 为您提供您要求的格式模式字符串。例如:

    ZonedDateTime dateTIme = ZonedDateTime.now(ZoneId.of("America/Recife"));

    Locale userLocale = Locale.forLanguageTag("pt-BR");
    String formatPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
            FormatStyle.LONG, FormatStyle.LONG,
            IsoChronology.INSTANCE, userLocale);
    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern(formatPattern, userLocale);
    String localeTimeString = dateTIme.format(formatter);

    System.out.println(localeTimeString);
    System.out.println(formatPattern);

刚才这段代码的输出是:

12 de Janeiro de 2020 17h7min52s BRT
d' de 'MMMM' de 'yyyy H'h'm'min's's' z

格式模式中的撇号包含文字部分,因此 dehmins 不被视为格式模式字母,而是输出字面意思是格式化的日期和时间。

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

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

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

链接