使用Kotlin在Android上的设备时区中显示日期/时间

时间:2018-10-20 02:40:59

标签: android kotlin simpledateformat

因此,我的应用程序从服务器的JSON文件中获取信息,其中有一些日期/时间值。时间和日期以UTC为单位。我需要在用户本地时区的应用程序中显示这些内容。

JSON数据示例:

"start":"2018-10-20 03:00:00","finish":"2018-10-20 05:00:00"

到目前为止,我的代码以UTC格式显示日期和时间。

val dateStringStart = radioScheduleDMList.get(position).start
        val dateStringEnd = radioScheduleDMList.get(position).finish

        val date = SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).parse(dateStringStart)
        val dateEnd = SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).parse(dateStringEnd)
        val day = SimpleDateFormat("d MMM").format(date)
        val startDate = SimpleDateFormat("ha").format(date)
        val endDate = SimpleDateFormat("ha").format(dateEnd)

如何使用设备时区显示此数据?我已经搜寻了几个小时。

使用上面的示例,我的应用显示日期为“ 20 OCT”,显示时间为“ 3 AM-5AM”。以我为例,我居住在澳大利亚(GMT + 10),所以我希望当天是“ OCT 20”和“ PM 1 PM-3PM”。简而言之,我想检测用户与UTC的时区偏移并将其应用于显示。

1 个答案:

答案 0 :(得分:0)

java.time和ThreeTenABP

    DateTimeFormatter jsonFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("d MMM", Locale.forLanguageTag("en-AU"));
    DateTimeFormatter hourFormatter
            = DateTimeFormatter.ofPattern("ha", Locale.forLanguageTag("en-AU"));
    ZoneId zone = ZoneId.systemDefault();

    String dateStringStart = "2018-10-20 03:00:00";

    OffsetDateTime startDateTime = LocalDateTime.parse(dateStringStart, jsonFormatter)
            .atOffset(ZoneOffset.UTC);
    ZonedDateTime userStartDateTime = startDateTime.atZoneSameInstant(zone);
    String startDayString = userStartDateTime.format(dateFormatter);
    String startTimeString = userStartDateTime.format(hourFormatter);
    System.out.println("Start day:  " + startDayString);
    System.out.println("Start hour: " + startTimeString);

对不起,我没有写Kotlin。您可以自己从Java转换吗?当我在默认时区为Australia / Brisbane的JVM上运行以上代码时,输​​出:

Start day:  20 Oct
Start hour: 1PM

在结束日期和时间上也要做类似的事情。

问题:我可以在Android上使用java.time吗?

是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在Java 6和7中,获得ThreeTen Backport,即新类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接