• Android获取自定义格式时区


    1 前言        

            我们知道,对于时区来说,有着不同标准,比如:GMT和UTC,而且还存在夏令时等一些让人疑惑的概念。那么,对于Android开发来说,想获取到合适的时区,应该怎么做呢?

            通常的,Android获取到的时区是使用Java的获取方式,默认获取GMT的标准。那么,根据返回时区的格式类型,一般有如下两种方式获取:

    1.1 格式1:GMT+08:00

    TimeZone.getDefault().getDisplayName(false, TimeZone.SHORT)

            上面是常见的获取GMT时区的方式,但是会存在返回“PST”、“WIB”等别名的时区,这会导致返回格式不统一,解析起来会存在问题。

    1.2 格式2:+0800

    SimpleDateFormat("Z").format(Calendar.getInstance(TimeZone.getTimeZone("GMT"),Locale.getDefault()).time)

            其实这种格式已经是比较通用,业务上可以直接使用这种方式统一时区格式。

    2 自定义格式:GMT+08:00

            针对我的业务,已经定好了GMT+08:00这种格式,但是使用格式1存在着返回格式不统一的问题。

            全网并未找到合适的自定义格式方式,于是去看源码类TimeZone,发现了一个方法createGmtOffsetString和我的需求很像,诸君请看:

    1. /**
    2. * Returns a string representation of an offset from UTC.
    3. *
    4. *

      The format is "[GMT](+|-)HH[:]MM". The output is not localized.

    5. *
    6. * @param includeGmt true to include "GMT", false to exclude
    7. * @param includeMinuteSeparator true to include the separator between hours and minutes, false
    8. * to exclude.
    9. * @param offsetMillis the offset from UTC
    10. *
    11. * @hide used internally by SimpleDateFormat
    12. */
    13. public static String createGmtOffsetString(boolean includeGmt,
    14. boolean includeMinuteSeparator, int offsetMillis)

            [GMT](+|-)HH[:]MM格式:includeGmt为true则显示“GMT”文本,includeMinuteSeparator为true则显示“:”。

            此时可根据业务需求去自定义。但这个方法是hide,我们可依葫芦画瓢重写一波此方法即可。

    如下所示:

    1. object LanguageUtils {
    2. /**
    3. * 获取当前时区
    4. * +0800 SimpleDateFormat("Z").format(Calendar.getInstance(TimeZone.getTimeZone("GMT"),Locale.getDefault()).time)
    5. * GMT+08:00 TimeZone.getDefault().getDisplayName(false, TimeZone.SHORT)——会存在PST、WIB直接别名的时区,后端不好过滤,赞、暂不采用
    6. * GMT+08:00 参考TimeZone方法createGmtOffsetString自定义方式实现
    7. * @return GMT+08:00
    8. */
    9. @JvmStatic
    10. fun getCurrentTimeZone(): String {
    11. return createGmtOffsetString(true, true, TimeZone.getDefault().rawOffset)
    12. }
    13. /**
    14. * Returns a string representation of an offset from UTC.
    15. *
    16. *

      The format is "[GMT](+|-)HH[:]MM". The output is not localized.

    17. *
    18. * @param includeGmt true to include "GMT", false to exclude
    19. * @param includeMinuteSeparator true to include the separator between hours and minutes, false
    20. * to exclude.
    21. * @param offsetMillis the offset from UTC
    22. *
    23. * @hide used internally by SimpleDateFormat
    24. */
    25. fun createGmtOffsetString(
    26. includeGmt: Boolean,
    27. includeMinuteSeparator: Boolean,
    28. offsetMillis: Int
    29. ): String {
    30. var offsetMinutes = offsetMillis / 60000
    31. var sign = '+'
    32. if (offsetMinutes < 0) {
    33. sign = '-'
    34. offsetMinutes = -offsetMinutes
    35. }
    36. val builder: StringBuilder = StringBuilder(9)
    37. if (includeGmt) {
    38. builder.append("GMT")
    39. }
    40. builder.append(sign)
    41. appendNumber(builder, 2, offsetMinutes / 60)
    42. if (includeMinuteSeparator) {
    43. builder.append(':')
    44. }
    45. appendNumber(builder, 2, offsetMinutes % 60)
    46. return builder.toString()
    47. }
    48. private fun appendNumber(builder: StringBuilder, count: Int, value: Int) {
    49. val string = value.toString()
    50. for (i in 0 until count - string.length) {
    51. builder.append('0')
    52. }
    53. builder.append(string);
    54. }
    55. }

    3 小结

            重写源码类TimeZone的createGmtOffsetString方法即可。

    赞一波,源码YYDS。。。

  • 相关阅读:
    Dueling Network Architectures for Deep Reinforcement Learning(Dueling-DQN)
    Jenkins从配置到实践(2022尚硅谷Jenkins学习笔记)
    微信小程序实战教程-3:京西购物商城实战之Home页实现
    Quartz之数据库存储(代码案例)
    Spirng 痛苦源码学习(一)——总起spring(一)
    【原创】非常详细!VMware安装Rocky Linux服务器系统并执行优化,包括修改安装镜像源、ssh免密等等
    kubeadm重新拉取集群的方式
    在国内CDMP认证认可度如何?
    git仓库清理
    DSPE-PEG2K-MAL|磷脂聚乙二醇马来酰亚胺(DSPE-PEG-MAL)|二硬脂酰基磷脂酰乙醇胺 聚乙二醇 马来酰亚胺,齐岳生物
  • 原文地址:https://blog.csdn.net/Agg_bin/article/details/126752853