我是Java和Android开发的新手,所以这可能是一个愚蠢的问题,但我一直在寻找几天,但找不到解决方案:
我尝试输出java.util.Date
,具体取决于用户的区域设置。
在StackOverflow上搜索引导我:
java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);
输出:
20/02/2011
在我的法语本地化电话上。差不多好。
如何使用用户的区域设置输出Date
的小时,分钟和秒组件?我一直在寻找Android文档,但找不到任何东西。
非常感谢。
答案 0 :(得分:30)
使用android.text.format.DateFormat.getTimeFormat()
参考:http://developer.android.com/reference/android/text/format/DateFormat.html
答案 1 :(得分:9)
ZonedDateTime.now( ZoneId.of( "Asia/Kolkata" ) )
.format( DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( Locale.FRENCH ) )
问题中的代码使用了麻烦的旧日期时间类,现在是旧的,被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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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()将为你提供当前语言环境的时间