Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 日期和时间格式取决于区域设置_Java_Android_Date_Formatting_Locale - Fatal编程技术网

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

Java 日期和时间格式取决于区域设置,java,android,date,formatting,locale,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 在我的法语本地

我对Java和Android开发都是新手,所以这可能是一个愚蠢的问题,但我已经搜索了几天,找不到解决方案:

我尝试根据用户的区域设置输出
java.util.Date

通过搜索StackOverflow,我发现:

java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);
这将产生:

20/02/2011
在我的法语本地化手机上。差不多好了

如何使用用户的区域设置输出日期的时、分、秒部分?我一直在查看android文档,但没有找到任何内容


非常感谢。

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


ref:

DateFormat.getTimeInstance()
获取具有默认语言环境的默认格式样式的时间格式化程序。您还可以传递样式和
区域设置
java.text.DateFormat
具有您可能需要的所有功能:

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;
}
DateFormat.getDateInstance()


DateFormat.getTimeInstance()

但你需要的是:

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

DateFormat.getDateTimeInstance(DateFormat.LONG、DateFormat.SHORT、Locale.FRENCH)格式(Date)

资料来源:

tl;博士 java.time 问题中的代码使用了麻烦的旧日期时间类(现在是遗留的),被java 8和更高版本中内置的java.time类所取代

地区和时区之间没有任何关系。Locale确定生成表示日期时间值的字符串时使用的人类语言和文化规范。时区确定用于表示时间线上某个时刻的特定区域的时间

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

2016-10-12T07:21:00.264Z

应用时区以获取
ZoneDateTime
。我任意选择用印度时区来显示这个时刻。同一时刻,时间线上的同一点

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );
2016-10-12T12:51:00.264+05:30[亚洲/加尔各答]

使用魁北克加拿大地区生成字符串。让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分


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
  • 内置的
  • 标准JavaAPI的一部分,带有捆绑实现
  • Java9添加了一些次要功能和修复
  • 大部分java.time功能都在中向后移植到Java6和Java7
  • 该项目专门针对Android采用了Three Ten Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和

使用
getBestDateTimePattern()
DateFormat.getBestDateTimePattern()
from
android.text.format
软件包根据用户设置的区域设置创建最佳的日期和时间

例如:骨架
EEEE,mmmd,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上的模式

示例代码 以下是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")
您也可以使用
ZoneDateTime
,而不是
Calendar
类。只需将其转换为
Date
对象,并将其转换为
format()
。例如:
Date(zonedDateTime.toInstant().toEpochMilli())


希望这能有所帮助。

看起来还可以,但你不应该像那样对异常进行中性化。不幸的是,这不包括秒。“你使用的是麻烦的旧日期时间类”说句公道话,我确实在2011年问过这个问题。谢谢你的跟进。您可能需要编辑答案,以明确现在的情况已经发生了变化。从目前的情况看,使用这些类在当时似乎是一件错误的事情,这可能会让人们感到困惑。感谢您写得这么好和结论性的回答。@ereOn没有任何批评的意图,也不可能被任何读者推断出来。所有帖子的日期都有明确的说明,所以帖子的年龄很明显,上下文也很清楚。事实上,我在第一句中使用的“现在”一词暗示了你的问题和我的答案之间的时间间隔。每个程序员都知道信息技术是快速发展的,总是在变化的。这很好。我看到你编辑了这个问题,使语气不那么“迂腐”和个人化,这肯定更好。我很感激。很高兴在这个过程中我们都学到了一些东西。谢谢你的回答!这个java sdk和大部分只能从Android上的26 API上获得,这是一个糟糕的答案,它是从另一个与Android无关的问题复制而来的谢谢!!!:-)
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")