日期和时间格式取决于区域设置

时间:2011-02-20 18:03:24

标签: java android date formatting locale

我是Java和Android开发的新手,所以这可能是一个愚蠢的问题,但我一直在寻找几天,但找不到解决方案:

我尝试输出java.util.Date,具体取决于用户的区域设置。

在StackOverflow上搜索引导我:

java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);

输出:

20/02/2011

在我的法语本地化电话上。差不多好。

如何使用用户的区域设置输出Date小时,分钟和秒组件?我一直在寻找Android文档,但找不到任何东西。

非常感谢。

7 个答案:

答案 0 :(得分:30)

使用android.text.format.DateFormat.getTimeFormat()

参考:http://developer.android.com/reference/android/text/format/DateFormat.html

答案 1 :(得分:9)

TL;博士

ZonedDateTime.now( ZoneId.of( "Asia/Kolkata" ) )
             .format( DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( Locale.FRENCH ) )

java.time

问题中的代码使用了麻烦的旧日期时间类,现在是旧的,被Java 8及更高版本中内置的java.time类所取代。

区域设置和时区彼此无关。 Locale确定生成String以表示日期时间值时使用的人类语言和文化规范。时区确定用于表示时间轴上某个时刻的特定区域的wall-clock time

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = Instant.now();
  

2016-10-12T07:21:00.264Z

应用时区以获得ZonedDateTime。我随意选择使用印度时区显示这一刻。同一时刻,时间轴上的同一点。

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );
  

2016-10-12T12:51:00.264 + 05:30 [亚/加尔各答]

使用QuébecCanada的区域设置生成字符串。让java.time自动本地化字符串。

Locale l = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( l );
String output = zdt.format ( f );  // Indian time zone with Québécois presentation/translation.
  

mercredi 2016年10月12日12小时51 IST

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:6)

java.text.DateFormat具有您可能需要的所有功能:

DateFormat.getDateInstance()

DateFormat.getTimeInstance()

但你需要的是:

DateFormat.getDateTimeInstance() 您还可以指定日期/时间部分的长度和区域设置。最终结果将是:

DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, Locale.FRENCH).format(Date);

来源:http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html

答案 3 :(得分:3)

DateFormat.getTimeInstance()获取具有默认语言环境的默认格式样式的时间格式化程序。您还可以传递样式和Locale

答案 4 :(得分:1)

public static String formatDate(Date date, boolean withTime)
{
    String result = "";
    DateFormat dateFormat;

    if (date != null)
    {
        try
        {
            String format = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT);
            if (TextUtils.isEmpty(format))
            {
                dateFormat = android.text.format.DateFormat.getDateFormat(context);
            }
            else
            {
                dateFormat = new SimpleDateFormat(format);
            }
            result = dateFormat.format(date);

            if (withTime)
            {
                dateFormat = android.text.format.DateFormat.getTimeFormat(context);
                result += " " + dateFormat.format(date);
            }
        }
        catch (Exception e)
        {
        }
    }

    return result;
}

答案 5 :(得分:0)

使用getBestDateTimePattern()

DateFormat.getBestDateTimePattern()包中的

android.text.format根据用户设置的语言环境创建最佳的日期和时间。

例如:骨架EEEE, MMM d, YYYY, jj:mm返回本地化的日期和时间,如下所示。

Locale English (India):            Monday 9 Sep 2019, 9:33 PM
Locale English (United States):    Monday, Sep 9, 2019, 9:33 PM
Locale español (Estados Unidos):   lunes, 9 de sep. de 2019 9:33 PM
Locale español (México):           lunes, 9 de sep de 2019 21:33
Locale français (France):          lundi 9 sept. 2019 à 21:33
Locale português (Brasil):         segunda-feira, 9 de set de 2019 21:33

,以此类推(针对不同的语言环境)。它还尊重语言环境的12小时或24小时时间格式。

要自定义您自己的骨架,请参考unicode.org上的UTS #35模式。

示例代码

这是Kotlin中经过测试的示例代码:

val skeleton = DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE, MMM d, YYYY, jj:mm")
val formatter = SimpleDateFormat(skeleton, Locale.getDefault()).apply {
    timeZone = TimeZone.getDefault()
    applyLocalizedPattern(skeleton)
}
val dateTimeText = formatter.format(calendar.time)
Log.d("YourClass", "Locale ${Locale.getDefault().displayName}: $dateTimeText")

您也可以使用Calendar代替ZonedDateTime类。只需将其转换为Date对象,然后将其提供给format()。例如:Date(zonedDateTime.toInstant().toEpochMilli())

希望有帮助。

答案 6 :(得分:-3)

如果你想要当前语言环境的小时秒和毫秒,那么使用Calendar.getInstance()。getTime()将为你提供当前语言环境的时间