首页 > 解决方案 > 用于管理 SimpleDateFormat 的 CodenameOne 实现的 X、XX、XXX(ISO 时区)格式案例的 Java 代码

问题描述

我使用 CodenameOne 跨平台工具创建了一个应用程序。它使用自己的 Java 类版本。在许多情况下,存在那些 CN1 类无法解决的边缘情况。目前尚不清楚它是多少。这是由于 API 版本问题或其他开发问题。

现在我必须使用 CN1 SimpleDateFormat 类。我检查了它,我不得不自己处理一些案件。

我用单引号和 u 参数管理文字,现在我必须处理时区

X, XX, XXX

参数。

我不知道是否应该处理其他情况。我的应用程序与 Android 或 Oracle 示例兼容,所以对我来说已经足够了,因为我至少可以重现示例案例。

X、XX、XXX 格式对应-08;-0800; -08:00

所以

我创建了这个代码,它依赖于 Z 时区参数,对应于 -0800

String format=completeFormatString;

Date date= new Date();
Calendar calendar = Calendar.getInstance(); //CN1 Calendar implementation
calendar.setTime(date);

String timeZoneFormat="Z";
SimpleDateFormat timeZoneDateFormat = new SimpleDateFormat(timeZoneFormat);
String timeZone=timeZoneDateFormat.format(calendar);

String timeZoneLastPart=timeZone.substring(timeZone.length()-2);
String timeZoneFirstPart=timeZone.substring(0,timeZone.length()-2);

format=StringUtil.replaceAll((format,"XXX",timeZoneFirstPart+":"+timeZoneLastPart);
format=StringUtil.replaceAll(format,"XX",timeZoneFirstPart+timeZoneLastPart);
format=StringUtil.replaceAll(format,"X",timeZoneFirstPart);

是否正确,将其放入我的应用程序是否安全?

标签: javacalendartimezonecodenameonesimpledateformat

解决方案


很遗憾你被这个臭名昭著的麻烦和长期过时的SimpleDateFormat课程困住了。以下是它在 Oracle Java 11 中的行为示例。

    for (String zid : new String[] { "Etc/UTC", "America/Inuvik", "Asia/Katmandu" }) {
        System.out.format("%-14s", zid);
        for (String formatPattern : new String[] { "Z", "X", "XX", "XXX" }) {
            SimpleDateFormat sdf = new SimpleDateFormat(formatPattern);
            sdf.setTimeZone(TimeZone.getTimeZone(ZoneId.of(zid)));
            System.out.format(" %-6s", sdf.format(0L));
        }
        System.out.println();
    }

输出是:

Etc/UTC        +0000  Z      Z      Z     
America/Inuvik -0800  -08    -0800  -08:00
Asia/Katmandu  +0530  +05    +0530  +05:30

似乎对于非零偏移量,它按照您在编写代码时所期望的方式工作。在我看来,您还需要+0000从模式字母构建偏移零的特殊情况,Z因为在这种情况下,模式字母大写X会产生Z(对于零或祖鲁时区),无论您使用X,XX还是XXX.


推荐阅读