如何在Android上使用本地化时间单位格式化字符串的持续时间?

时间:2015-07-02 11:04:21

标签: android time formatting

我想格式化一个字符串中的持续时间(例如以秒为单位),该字符串将包含时间单位的本地化名称。例如,对于输入8692,我将得到字符串“2小时24分52秒”,其中时间单位正确地针对每种语言进行了本地化。 Android中是否有一些类可以做到这一点?有没有人知道一些外部开源库?谢谢。

3 个答案:

答案 0 :(得分:2)

我不了解任何开源库,但如果我正确理解了这个问题,手动操作就不会太难了:

public static String foo(int duration) {
    int hours = duration/3600;
    int minutes = (duration%3600)/60;
    int seconds = duration%60;
    return hours + getResources().getString(R.string.hours) +
           minutes + getResources().getString(R.string.minutes) +
           seconds + getResources().getString(R.string.seconds);
}

然后在strings.xml中定义这些字符串并按照通常的方式对其进行本地化。 (见http://developer.android.com/reference/javax/xml/datatype/Duration.html

对于Android,您可以使用Duration类({{3}}),但其toString()方法并不完全符合您的要求。

编辑只是为了完整性:我现在更好地了解您的问题,您不想手动本地化所有时间单位。 Unicode公共区域设置数据存储库提供了一些(很多,很多)有趣的数据。它们提供了几乎任何你想要本地化的XML数据,例如: de.xml(德语):

<unit type="duration-hour">
    <displayName>Stunden</displayName>
    <unitPattern count="one">{0} Stunde</unitPattern>
    <unitPattern count="other">{0} Stunden</unitPattern>
    <perUnitPattern>{0} pro Stunde</perUnitPattern>
</unit>

我认为这是过度杀伤,但正如我所说:为了完整性。

答案 1 :(得分:0)

我是那样做的。

val minuteString = systemResources.getString(systemResources.getIdentifier("minute", "string", "android"))
val secondString = systemResources.getString(systemResources.getIdentifier("second", "string", "android"))
val hourString = systemResources.getString(systemResources.getIdentifier("hour", "string", "android"))
val dayString = systemResources.getString(systemResources.getIdentifier("day", "string", "android")

在此文件中,您将查找其他时间单位资源https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/strings.xml

答案 2 :(得分:0)

当我尝试使用本地化格式打印Kotlin public function search(Request $request){ $input = $request->all(); //Just google api search this populates fine. $location = $this->geolocatePostcode( $input['postal_code'] ); $instructors=\App\User::with(['teacher', 'teacher.class','teacher.location' => function ($query) use($location) { $locations = new Location; $locations->searchLocationsByDistance($query,$location->lat,$location->lng); }]) //->where('type', '==', 'instructor') ->get(); // var_dump($instructors); return response()->json($instructors->toArray()); } 类型时遇到了同样的问题,由于找不到好的解决方案,我自己写了一个。它基于从Android 9(适用于本地化单位)开始提供的API,但对于较低的Android版本则回落到英文单位,因此可以与较低定位的应用一起使用。

这是用法方面的外观(请参阅Kotlin Duration类型以了解第一行):

Duration

如您所见,您可以为val duration = 5.days.plus(3.hours).plus(2.minutes).plus(214.milliseconds) DurationFormat().format(duration) // "5day 3hour 2min" DurationFormat(Locale.GERMANY).format(duration) // "5T 3Std. 2Min." DurationFormat(Locale.forLanguageTag("ar").format(duration) // "٥يوم ٣ساعة ٢د" DurationFormat().format(duration, smallestUnit = DurationFormat.Unit.HOUR) // "5day 3hour" DurationFormat().format(15.minutes) // "15min" DurationFormat().format(0.hours) // "0sec" 类型指定自定义locale。默认情况下,它使用DurationFormat。还支持数字符号与罗马符号不同的语言(通过Locale.getDefault())。另外,您可以指定自定义NumberFormat,默认情况下将其设置为smallestUnit,因此不会显示毫秒。请注意,任何值为SECOND的单位都将被忽略,如果整数为0,则最小的单位将使用值0

这是完整的0类型,可以随时复制(也可以作为GitHub gist,包括单元测试):

DurationFormat