Java 日期和时间格式取决于区域设置
我对Java和Android开发都是新手,所以这可能是一个愚蠢的问题,但我已经搜索了几天,找不到解决方案: 我尝试根据用户的区域设置输出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.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()
fromandroid.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")