管理SimpleDateFormat的CodenameOne实现的X, XX, XXX (ISO时区)格式案例的Java



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

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

我用单引号管理了字面量,u参数,现在我必须处理时区

X, XX, XXX

参数。

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

X, xx, XXX格式应该对应于-08;-0800;喂饲

我创建了这个代码,它依赖于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);

它是正确的,它是安全的把它放在我的应用程序?

遗憾的是,您必须使用出了名的麻烦和过时的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

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

最新更新