【问题标题】:How to get the date-time format string from current Locale, as a parameter for SimpleDateFormat如何从当前语言环境中获取日期时间格式字符串,作为 SimpleDateFormat 的参数
【发布时间】:2020-04-29 14:32:46
【问题描述】:

我的 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”

提供的代码 sn-p 旨在根据当前的 Locale 获取日期时间形式,但我不知道如何将它也作为格式字符串获取。应该通过上面的getTheCurrentLocaleDateTimeFormatString()方法计算出来。

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

这是相关文档页面:

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

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

【问题讨论】:

  • his 回答你的问题了吗?
  • @Jens 我编辑了问题,我需要将格式字符串作为模板显示给用户
  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。

标签: java android locale simpledateformat datetime-format


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 我编辑了问题,我需要将格式字符串作为模板显示给用户
  • 感谢您的耐心等待,但我还需要当前时间,所以我需要一个完整的日期和时间字符串。有可能吗?
【解决方案2】:

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

刚才这个 sn-p 的输出是:

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,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多