当前位置:   article > 正文

Android获取自定义格式时区_android 获取时区

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. * <p>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. * <p>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。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/294890
推荐阅读
相关标签
  

闽ICP备14008679号