我目前正在尝试编写一套时区验证程序,以查看各种平台是否解释了IANA时区数据.
我定位的输出格式包括特定时间的有效缩写 - 例如"英国夏令时"的"BST"或"太平洋标准时间"的"PST".
在大多数平台上,这很容易 - 但奇怪的是,ICU4J似乎没有工作.根据SimpleDateFormat文档,我应该能够使用"zzz"模式来获得我正在寻找的东西,但这似乎在很多时候都回归到GMT + X的"O"模式.对于某些时区,根本没有缩写.
使用纽约的简短示例:
import java.util.Date;
import java.util.Locale;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.text.SimpleDateFormat;
public class Test {
public static void main(String[] args) {
TimeZone zone = TimeZone.getTimeZone("America/New_York");
SimpleDateFormat format = new SimpleDateFormat("zzz", Locale.US);
format.setTimeZone(zone);
// One month before the unix epoch
System.out.println(format.format(new Date(-2678400000L))); // GMT-5
// At the unix epoch
System.out.println(format.format(new Date(0L))); // EST
}
}
Run Code Online (Sandbox Code Playgroud)
(我正在使用ICU4J 55.1运行,包括库存下载和使用2015e数据发布更新后.)
我不清楚ICU4J是从tz数据还是从CLDR得到它的缩写 - 我怀疑它是后者,因为tz数据中没有任何东西可以暗示这里有所不同.
它似乎也受到语言环境的影响,我认为这是合理的 - 使用美国语言环境我可以看到美国/纽约的EST/EDT,但欧洲/伦敦没有; 在英国的地方,我看到欧洲/伦敦的GMT/BST,但美国/纽约没什么:(
有没有办法说服ICU4J回退到tz缩写?在我非常具体的情况下,这就是我正在寻找的.
更新
感谢RealSkeptic的评论,它看起来 …
我需要创建一个对应于https://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive/的Collator,即在进行比较时忽略ASCII A-Z和a-z字符的区分大小写.
我尝试使用以下ICU4j RuleBasedCollator:
final RuleBasedCollator collator =
new RuleBasedCollator("&a=A, b=B, c=C, d=D, e=E, f=F, g=G, h=H, "
+ "i=I, j=J, k=K, l=L, m=M, n=N, o=O, p=P, q=Q, r=R, s=S, t=T, "
+ "u=U, v=V, u=U, v=V, w=W, x=X, y=Y, z=Z").freeze();
Run Code Online (Sandbox Code Playgroud)
但是,以下比较似乎失败了,我希望它能成功(即返回true):
final SearchIterator searchIterator = new StringSearch(
"pu", new StringCharacterIterator("iNPut"), collator);
return searchIterator.first() >= 0;
Run Code Online (Sandbox Code Playgroud)
我的规则中缺少什么?
我们要求将阿拉伯语文本音译为拉丁字符(不带变音符号)并将其显示给用户.
我们目前正在使用IBM ICU4j.API不能很好地将阿拉伯文本转换成适当的可读拉丁字符.请参考以下示例:
例
阿拉伯文:
صدامحسينالتكريتي
谷歌的音译输出
: Sadaam Hussein al-tikriti
ICU4J的音译输出
: ?d?m ?syn ?ltkryty
我们如何提高ICU4j库的音译输出?
ICU4J为我们提供了编写我们自己的规则的选项,但我们目前陷入困境,因为我们团队中没有人知道阿拉伯语,并且无法找到任何可以遵循的正确标准.
我有一个包含在不同 android 应用程序中的内部库。这个库依赖于 ICU4J。这意味着我们向最终 APK 添加了约 10MB。
lib 使用 ICU4J 的一个子集,所以我想删除所有不必要的数据文件。
从ICU文档:
目前 ICU4J 没有提供任何工具来揭示数据文件之间的这些依赖关系,因此直接在 ICU4J 项目中修剪数据是一件难事。删除数据时的关键点是确保也删除对该数据的所有依赖项。
我想在构建应用程序时删除数据文件。
StackOverflow 上的一个问题是相关的:Exclude specific resources from a aar dep。不幸的是,该exploded-aar目录不再存在。
您知道我可以在哪一步从 ICU4J 依赖项中删除文件吗?这是我尝试删除cjdict.dict文件的内容:
tasks.create("excludeTask") << {
["java/com/ibm/icu/impl/data/icudt60b/brkitr/cjdict.dict"]
.collect { "${getGroup()}/${getName()}/${getVersion()}/${it}"}
.each {
// Question 2. From which dir should I remove the files?
File file = file("${buildDir}/intermediates/exploded-aar/${it}")
println("Excluding file " + file)
if (file.exists()) {
file.delete();
}
}
}
tasks.whenTaskAdded({
// Question 1. Before which task …Run Code Online (Sandbox Code Playgroud) 作为国际化的一部分,得到了支持少数国家的要求
安提瓜和巴布达 - ISO3166代码 - AG和多米尼加共和国 - ISO3166代码 - DO
Locale loc = new Locale("en", "AG");
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, loc);
System.out.println("Short format: " + df1.format(new Date()));
Run Code Online (Sandbox Code Playgroud)
Java将以mm/dd/yy格式显示日期,其中这些国家/地区的日期格式为dd/mm/yy.
有什么方法可以达到dd/mm/yy的模式吗?甚至ICU4J图书馆也不支持这些国家?
提前致谢