CodenameOne中SimpleDateFormat的XXX格式获取ISO时区的实现方法咨询
Codename One 兼容ISO 8601时区(X/XX/XXX格式)实现方案
核心实现思路
首先通过CN1提供的Calendar类获取时区偏移总量(包含夏令时偏移),再根据X系列格式的规则格式化输出即可,全程不需要依赖Java原生的SimpleDateFormat或其他未被CN1克隆的类。
步骤1:计算时区总偏移量
首先从Calendar实例中获取基础时区偏移和夏令时偏移,换算为总偏移分钟数:
// cal为你已初始化的Calendar实例 int zoneOffsetMs = cal.get(Calendar.ZONE_OFFSET); int dstOffsetMs = cal.get(Calendar.DST_OFFSET); // 总偏移毫秒数转分钟数,避免小数误差 int totalOffsetMin = (zoneOffsetMs + dstOffsetMs) / (1000 * 60);
步骤2:处理UTC偏移特殊情况
ISO 8601规则规定,当时区偏移为0(即UTC时区)时,所有X系列格式统一输出Z:
if (totalOffsetMin == 0) { return "Z"; }
步骤3:拆分偏移的符号、小时、分钟
// 确定正负符号 char sign = totalOffsetMin > 0 ? '+' : '-'; // 取绝对值计算时分 int absOffset = Math.abs(totalOffsetMin); int offsetHour = absOffset / 60; int offsetMin = absOffset % 60;
步骤4:按X系列格式输出
和Android端对齐的规则如下:
- 单个
X格式:输出±HH,若分钟偏移不为0可补充输出分钟为±HHmm,示例值:-08、+0530 - 两个
XX格式:输出±HHmm,固定带4位数字,示例值:-0800、+0530 - 三个
XXX格式:输出±HH:mm,时分之间带冒号分隔,示例值:-08:00、+05:30
对应代码实现(如果CN1不支持String.format,可以自行实现补零逻辑:小于10的数字前拼接"0"即可):
// 单个X格式实现 String xRes = String.format("%c%02d", sign, offsetHour); if (offsetMin != 0) { xRes += String.format("%02d", offsetMin); } // XX格式实现 String xxRes = String.format("%c%02d%02d", sign, offsetHour, offsetMin); // XXX格式实现 String xxxRes = String.format("%c%02d:%02d", sign, offsetHour, offsetMin);
注意事项
- 如果你需要实现反向解析功能,只需将时区字符串按格式拆分符号、小时、分钟,换算为总偏移毫秒数后调用
Calendar.setTimeZone()对应方法即可 - 若CN1的
String.format不支持补零占位符,可自行实现工具方法:比如定义一个padTwoDigits(int num)方法,当num<10时返回"0"+num,否则返回String.valueOf(num)
内容的提问来源于stack exchange,提问作者P5music
相关产品推荐
相关产品推荐

