我使用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
,XX
或XXX
。