赞
踩
我们知道,对于时区来说,有着不同标准,比如:GMT和UTC,而且还存在夏令时等一些让人疑惑的概念。那么,对于Android开发来说,想获取到合适的时区,应该怎么做呢?
通常的,Android获取到的时区是使用Java的获取方式,默认获取GMT的标准。那么,根据返回时区的格式类型,一般有如下两种方式获取:
TimeZone.getDefault().getDisplayName(false, TimeZone.SHORT)
上面是常见的获取GMT时区的方式,但是会存在返回“PST”、“WIB”等别名的时区,这会导致返回格式不统一,解析起来会存在问题。
SimpleDateFormat("Z").format(Calendar.getInstance(TimeZone.getTimeZone("GMT"),Locale.getDefault()).time)
其实这种格式已经是比较通用,业务上可以直接使用这种方式统一时区格式。
针对我的业务,已经定好了GMT+08:00这种格式,但是使用格式1存在着返回格式不统一的问题。
全网并未找到合适的自定义格式方式,于是去看源码类TimeZone,发现了一个方法createGmtOffsetString和我的需求很像,诸君请看:
- /**
- * Returns a string representation of an offset from UTC.
- *
- * <p>The format is "[GMT](+|-)HH[:]MM". The output is not localized.
- *
- * @param includeGmt true to include "GMT", false to exclude
- * @param includeMinuteSeparator true to include the separator between hours and minutes, false
- * to exclude.
- * @param offsetMillis the offset from UTC
- *
- * @hide used internally by SimpleDateFormat
- */
- public static String createGmtOffsetString(boolean includeGmt,
- boolean includeMinuteSeparator, int offsetMillis)
[GMT](+|-)HH[:]MM格式:includeGmt为true则显示“GMT”文本,includeMinuteSeparator为true则显示“:”。
此时可根据业务需求去自定义。但这个方法是hide,我们可依葫芦画瓢重写一波此方法即可。
如下所示:
- object LanguageUtils {
-
- /**
- * 获取当前时区
- * +0800 SimpleDateFormat("Z").format(Calendar.getInstance(TimeZone.getTimeZone("GMT"),Locale.getDefault()).time)
- * GMT+08:00 TimeZone.getDefault().getDisplayName(false, TimeZone.SHORT)——会存在PST、WIB直接别名的时区,后端不好过滤,赞、暂不采用
- * GMT+08:00 参考TimeZone方法createGmtOffsetString自定义方式实现
- * @return GMT+08:00
- */
- @JvmStatic
- fun getCurrentTimeZone(): String {
- return createGmtOffsetString(true, true, TimeZone.getDefault().rawOffset)
- }
-
- /**
- * Returns a string representation of an offset from UTC.
- *
- * <p>The format is "[GMT](+|-)HH[:]MM". The output is not localized.
- *
- * @param includeGmt true to include "GMT", false to exclude
- * @param includeMinuteSeparator true to include the separator between hours and minutes, false
- * to exclude.
- * @param offsetMillis the offset from UTC
- *
- * @hide used internally by SimpleDateFormat
- */
- fun createGmtOffsetString(
- includeGmt: Boolean,
- includeMinuteSeparator: Boolean,
- offsetMillis: Int
- ): String {
- var offsetMinutes = offsetMillis / 60000
- var sign = '+'
- if (offsetMinutes < 0) {
- sign = '-'
- offsetMinutes = -offsetMinutes
- }
- val builder: StringBuilder = StringBuilder(9)
- if (includeGmt) {
- builder.append("GMT")
- }
- builder.append(sign)
- appendNumber(builder, 2, offsetMinutes / 60)
- if (includeMinuteSeparator) {
- builder.append(':')
- }
- appendNumber(builder, 2, offsetMinutes % 60)
- return builder.toString()
- }
-
- private fun appendNumber(builder: StringBuilder, count: Int, value: Int) {
- val string = value.toString()
- for (i in 0 until count - string.length) {
- builder.append('0')
- }
- builder.append(string);
- }
-
- }
重写源码类TimeZone的createGmtOffsetString方法即可。
赞一波,源码YYDS。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。