java国际化——日期和时间+排序

【0】README

1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化——日期和时间+排序 的基础知识 ;


【1】日期和时间

1)当格式化日期和时间时,需要考虑4个与 Locale 相关的问题: (干货——当格式化日期和时间时,需要考虑4个与 Locale 相关的问题)

  • 1.1)月份和星期应该用本地语言来表示;
  • 1.2)年月日的顺序要符合本地习惯;
  • 1.3)公历可能不是本地首选的日期表示方法;
  • 1.4)必须要考虑本地的时区;

2)solution: java 的 DateFormat 类可以处理这些问题。 它和 NumberFormat 类很相似;

  • step1)首先, 得到一个 Locale, 可以使用默认的Locale 或调用静态的 getAvialbleLocales 方法来得到一个 支持日期格式化的Locale 数组;
  • step2)然后,调用下列3个工厂方法之一:

    fmt = DateFormat.getDateInstance(dateStyle, loc);
    fmt = DateFormat.getTimeInstance(timeStyle, loc);
    fmt = DateFormat.getDateTimeInstance(dateStyle, timeStyle, loc);

  • 2.1)为了支持设定想要的风格, 这些工厂方法设计了一个参数,可以是如下值:

    DateFormat.DEFAULT
    DateFormat.FULL
    DateFormat.LONG
    DateFormat.MEDIUM
    DateFormat.SHORT

  • 2.2) 工厂方法返回一个格式化对象, 可以用它来格式化日期:

    Date now = new Date();
    String s = fmt.format(now);

  • 2.3)和 NumberFormat 类一样, 你可以使用 parse 方法来解析用户输入的一个日期(解析String类型)。如

    TextField inputField ;
    DateFormat format = DateFormat.getDateInstance(DateFormat.MEDIUM);
    Date input = fmt.parse(inputField.getText().trim());

3)看个荔枝(格式化日期和时间):

// date format with given localepublic static void main(String[] args){DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.CHINA);String dateAndTime = fmt.format(new Date());System.out.println(dateAndTime); // Thu Feb 04 13:48:59 CST 2016        try{System.out.println(fmt.parse(dateAndTime.toString()));} catch (ParseException e){e.printStackTrace();}}

这里写图片描述


【2】排序(不同Locales, 不同的规则罢了, Collator 叫做排序器)

1)problem+solution

  • 1.1)problem: java中的 compareTo方法使用 Unicode字符来决定顺序的。如,小写字母的Unicode值比大写的大,有重音符的字母的值甚至更大, 这将使结果失去意义(如大写A,和重音符A,无法通过字典序做比较);
    1.2)solution: 一般,先得到一个 Locale 对象,然后,调用 getInstance 工厂方法来得到一个 Collator 对象,最后,当希望对字符串进行排序时,使用这个排序器的compare方法,而不是String类的 compareTo 方法, 如:
Locale loc = ....;
Collator coll = Collator.getInstance(loc);
if(coll.compare(a,b) < 0) // a comes before b...

Attention) 更为重要的是, Collator 类实现了 Comparetor 接口, 因此,可以传一个 排序器对象到 Collections.sort 方法来对一组字符串进行排序: Collections.sort(strings, coll);


【3】排序强度

1)字符间的差别: 分为首要的、其次的、和再次的;如, A 和 Z 之间的差别被归为首要的, 而 A 和 A(头顶小圆圈)的差别是其次的, 而A 和 a 是再次的;
2)排序强度设置:
这里写图片描述

  • 2.1)如果将强度设为 Collator.PRIMARY:那么排序器将只关注 primary级的差别;
  • 2.2) 如果将强度设为 Collator.SECONDARY: 那么排序器将关注 primary + secondary 级的差别, 也就是说,两个字符串在“secondary”或“tertiary”强度下很容易被区分开;
  • 2.3) 如果将强度设为 Collator.IDENTICAL:则不允许有任何差异;这种设置在与排序器的第二种具有相当技术性的设置,即分解模式,联合使用时,就会显得特别有用;

这里写图片描述


【4】排序器分解模式

1)分解: 即一个字符对应多个Unicode编码;如A(头顶一个圆圈)可以是Unicode字符 U+00C5, 或者表示为 普通的A(U+0065)后跟一个圆圈;
2)Unicode标准: 对字符串定义了四种范化形式: D, KD, C 和 KC;
3)我们可以选择排序器所使用的范化程度(如下表所示):
这里写图片描述

  • 3.1)NO_DECOMPOSITION(不分解): Collator.NO_DECOMPOSITION 表示不对字符串做任何范化,这时选项处理速度较快, 但是对于以多种形式表示字符的文本就显得不适用了;
  • 3.2)CANONICAL_DECOMPOSITION(规范分解): 默认值Collator.CANONICAL_DECOMPOSITION 使用 范化形式D, 这对于包含重音但不包含连字的文本是非常有用的形式;
  • 3.3)完全分解: 最后是使用 范化形式KD的完全分解;

4)让排序器去多次分解一个字符串是很浪费时间的: getCollationKey方法: 返回一个 CollationKey对象, 可以用它来进行更深入的,更快速的比较操作,下面是一个荔枝: (干货——让排序器去多次分解一个字符串是很浪费时间的,故而引入了 getCollationKey方法, CollationKey==排序键)

String a = …;
CollationKey key = coll.getCollationKey(a);
if(key.compareTo(coll.getCollationKey(b)) == 0) // fast comparison

5)最后,有可能在你不需要进行排序时, 也希望将字符串转换为它们的范化形式。java.text.Normalizer 类实现了 对范化的处理, 如:

String name = “augs”;
String normalized = Normalizer.normalize(name, Normalizer.Form.NFD); // use normalization from D

6)看个荔枝(为排序器设置排序强度和为排序器设置分解模式):

public static void main(String[] args){//为排序器设置排序强度Collator collator = Collator.getInstance(Locale.US);collator.setStrength(Collator.PRIMARY);// 强度为 primary(主要的)out.println(collator.compare("Able", "able")); // return 0(equal)collator.setStrength(Collator.SECONDARY);// 强度为secondary(次要的)out.println(collator.compare("Able", "able")); // return 0(equal)collator.setStrength(Collator.IDENTICAL);// 强度为 Identical(再次的 == 分解模式)out.println(collator.compare("Able", "able")); // return 1(unequal)// over//为排序器设置分解模式out.println("\u00E1");collator.setDecomposition(Collator.NO_DECOMPOSITION); // 设置为不分解模式out.println(collator.compare("\u00E1", "a"));collator.setDecomposition(Collator.FULL_DECOMPOSITION); // 设置为完全分解模式out.println(collator.compare("\u00E1", "a"));}

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm 垃圾收集算法_JVM垃圾收集和优化

jvm 垃圾收集算法总览 在对系统进行性能相关问题的故障排除时&#xff0c;内存优化是一个需要深入分析每个系统在内存中存储的内容&#xff0c;存储时间和访问方式的场所。 这篇文章是要对背景信息进行注释&#xff0c;并在此工作中要注意一些要点&#xff0c;这些工作要针对基…

数据库SQL索引

一、索引的意义 表中创建索引&#xff0c;以便更加快速高效地查询数据。 用户无法看到索引&#xff0c;它们只能被用来加速搜索/查询。 注释&#xff1a;更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间&#xff0c;这是由于索引本身也需要更新。因此&#x…

java国际化——消息格式化+文本文件和字符集

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 测试源代码均为原创&#xff0c; 旨在理解 java国际化——消息格式化文本文件和字符集 的基础知识 &#xff1b; 2&#xff09; 由于本文涉及到的源代码都比较简单&#xff0c;所以直接将全…

java 8 新功能详解_Java 8和Java 14之间的新功能

java 8 新功能详解从版本9开始&#xff0c;Java每6个月就有一次新功能&#xff0c;因此很难跟踪这些新更改。 互联网上的大多数信息都描述了最近2个Java版本之间的变化。 但是&#xff0c;如果您的情况与我相似&#xff0c;则说明您使用的不是Java的最新版本&#xff0c;而是使…

Tomcat配置虚拟内存

一、Tomcat启动参数JAVA_OPTS参数说明   -server 启用jdk 的 server 版&#xff1b;   -Xms java 虚拟机初始化时的堆最小内存&#xff1b;   -Xmx java 虚拟机可使用堆的最大内存&#xff1b;   -XX: PermSize 非堆内存永久保留区域   -XX:MaxPermS…

ISO语言代码和国家代码+Locale常量+ISO货币符号

【1】ISO语言代码和国家代码 【2】Locale常量 【3】ISO货币符号

djl和ljl_使用Spring Boot和DJL进行深度学习

djl和ljl总览 这是Spring Boot上的另一篇文章 &#xff0c;该文章将展示如何使用Deep Java Library &#xff08;DJL&#xff09;构建示例Web应用程序&#xff0c; Deep Java Library &#xff08;DJL&#xff09;是Java的开源深度学习库&#xff0c;用于诊断X射线图像上的COVI…

java BigDecimal八种舍入模式

一、BigDecimal介绍java.math.BigDecimal不可变的immutable、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。标度(scale)如果为零或正数&#xff0c;则标度是小数点后的位数。如果为负数&#xff0c;则将该数的非标度值乘以10的…

java国际化——资源包

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 旨在理解 java国际化——资源包 的基础知识 &#xff1b; 2&#xff09; 本文源代码idea 转自&#xff1a; &#xff08;利用properties 文件进行国际化&#xff09;https://docs.oracle.co…

ui自动化测试测试报告_您需要了解的有关UI测试的所有信息

ui自动化测试测试报告让我们从一个问题开始。 用户在网站上进行互动的第一件事是什么&#xff1f; 接口&#xff0c;当然。 网站的外观是在用户身上产生“第一印象”的第一件事。 交互式Web应用程序可以为用户带来成败&#xff0c;这就是为什么越来越多的人选择对其Web应用程序…

Tomcat解决HTTP GET中文乱码

一、中文乱码原因 Tomcat默认是按ISO-8859-1进行URL解码&#xff0c;ISO-8859-1并未包括中文字符&#xff0c;中文字符不能被正确解析了。 二、配置编码 在tomcat的conf/server.xml下的connetor属性中增加URIEncoding或者useBodyEncodingForURI属性 &#xff08;1&#xff0…

NanoHTTPD web server的一个简单荔枝

【0】README 0.1&#xff09;本文旨在演示一个简单荔枝&#xff0c;以说明如何使用 NanoHTTPD web server 和 浏览器访问 该server的效果 -------------------------------------------------------------- App.java public class App extends NanoHTTPD {public App() thr…

throwable_您想了解的所有Throwable

throwable本文是有关异常的教程。 但不是通常的一种。 其中有许多内容可以告诉您异常的含义&#xff0c;如何抛出异常&#xff0c;捕获异常&#xff0c;已检查异常和运行时异常之间的区别&#xff0c;等等。 没有必要了。 这对您来说也很无聊。 如果没有&#xff0c;那么请阅读…

Linux Tomcat安装

一、linux 安装软件的步骤 &#xff08;1&#xff09;下载软件的压缩包 &#xff08;2&#xff09;解压到指定的目录 &#xff08;3&#xff09;配置环境变量 &#xff0c;配置PATH&#xff08;在任意目录启动&#xff0c;这PATH可以省略&#xff0c;若不配置只有安装目录才…

java分布式对象(RMI+部署使用RMI的程序)

【0】README 1&#xff09;本文文字转自 core java volume 2&#xff0c; 旨在学习 java 分布式对象的相关知识&#xff1b; 2&#xff09; RMI 的实例程序为原创&#xff1b; 3&#xff09; RMI部署步骤的测试用例&#xff0c;参见 http://blog.csdn.net/pacosonswjtu/arti…

java 创建uri_使用UriBuilder快速创建URI

java 创建uri如果您有权访问JAX-RS API和项目中的实现&#xff08;很多&#xff09;&#xff0c;则可以使用JAX-RS的UriBuilder通过使用可解析占位符的构建器模式方便地创建URI。 看下面的例子&#xff1a; String host System.getProperty( "host" , "localh…

Tomcat 服务自动启动

一、配置/etc/rc.local rc.local是linux启动init之后执行的脚本。 sudo vi /etc/rc.local 添加如下一行 /home/myuser/software/apache-tomcat-7.0.29/bin/startup.sh&#xff08;脚本绝对路径&#xff09; 二、sysv-rc-conf 工具配置 1、安装 sysv-rc-conf sudo apt-get …

java分布式对象RMI应用测试用例

【0】README 0.1&#xff09;本文旨在对http://blog.csdn.net/PacosonSWJTU/article/details/50705192 中的代码进行实践&#xff08;如何部署一个使用RMI框架的程序以进行远程调用&#xff09;&#xff1b; 0.2&#xff09; for complete source code, please visit https…

neo4j 迁移_在Kubernetes中迁移Neo4j图模式

neo4j 迁移在零停机时间下运行企业应用程序时&#xff0c;我们需要能够执行数据库架构迁移而又不中断活动用户。 这不仅对于关系数据库很重要&#xff0c;而且对于诸如Neo4J之类的图数据库也很重要&#xff0c;后者不会在write上强制执行架构。 但是&#xff0c;重构图形并使图…

Windows访问Linux的Tomcat,显示无法连接

一、端口占用 先查看tomcat下的logs日志文件&#xff0c;如果现实地址已被占用&#xff0c;则需重新修改端口。 tomcat默认启动的是8080&#xff0c;如果你想修改为80&#xff0c;则需要修改server.xml文件:vim $CATALINA_HOME/conf/server.xml #如果没有配置$CATALINA_HOME&am…