Java笔记1:Java基础类库

作者:陆金龙    发表时间:2018-05-23 22:40   


以下内容来源于《疯狂Java讲义》第7章 Java类库
 
7.1 Scanner
 
// 以System.in节点流创建一个BufferedReader对象
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null)
{
  System.out.println("用户键盘输入的当前行是:" + line);
}

Scanner sc = new Scanner(System.in);
// 只把回车作为分隔符(在Unix/Linux系统中,换行用"\n"一个字符表示,而在Windows系统中,则用"\n\r"两个字符表示。)
sc.useDelimiter("\n");
while(sc.hasNext())
{
  System.out.println("键盘输入的内容是:"+ sc.next());
}

Scanner sc = new Scanner(System.in);
while(sc.hasNextLong())
{
  System.out.println("键盘输入的长整型数字是:"+ sc.nextLong());
}

// 将一个File对象作为Scanner的构造器参数,Scanner读取文件内容
Scanner sc = new Scanner(new File("ScannerFileTest.java"));
System.out.println("ScannerFileTest.java文件内容如下:");
while(sc.hasNextLine())
{
  System.out.println(sc.nextLine());
}
 
7.2.1 System
 
// 获取系统所有的环境变量
Map env = System.getenv();
for (String name : env.keySet())
{
  System.out.println(name + " ---> " + env.get(name));
}
// 获取指定环境变量的值
System.out.println(System.getenv("JAVA_HOME"));

// 获取所有的系统属性 保存到props.txt文件中
Properties props = System.getProperties();
props.store(new FileOutputStream("props.txt"), "System Properties");

// 输出特定的系统属性
System.out.println(System.getProperty("os.name"));


System.identityHashCode 和 String.hashCode

// s1和s2是两个不同对象,它们的identityHashCode值不同
// String重写了hashCode()方法——改为根据字符序列计算hashCode值,s1和s2的字符序列相同,所以hashCode返回值相同
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(System.identityHashCode(s1)+ "----" + System.identityHashCode(s2));

// s3和s4是相同的字符串对象,它们的identityHashCode值相同
String s3 = "Java";
String s4 = "Java";
 
7.2.2 RunTime
// 获取Java程序关联的运行时对象
Runtime rt = Runtime.getRuntime();
System.out.println("处理器数量:"+ rt.availableProcessors());
System.out.println("空闲内存数:"+ rt.freeMemory());
System.out.println("总内存数:"+ rt.totalMemory());
System.out.println("可用最大内存数:"+ rt.maxMemory());
 
// 运行记事本程序
rt.exec("notepad.exe");
 
7.3 常用类
7.3.1 Object 克隆
 
class Address
{
String detail;
public Address(String detail)
{
this.detail = detail;
}
}
// 实现Cloneable接口
class User implements Cloneable
{
int age;
Address address;
public User(int age)
{
this.age = age;
this.address = new Address("广州天河");
}
// 通过调用super.clone()来实现clone()方法
public User clone()
throws CloneNotSupportedException
{
return (User)super.clone();
}
}
public class CloneTest
{
public static void main(String[] args) throws CloneNotSupportedException
{
User u1 = new User(29);
User u2 = u1.clone();
System.out.println(u1 == u2);      //① false u1和u2是存在于不同的内存堆中的两个对象
System.out.println(u1.address == u2.address);     //② true 浅克隆 u1、u2的address指向同一个引用地址
}
}
 
7.3.2 Objects类
 
// 输出一个null对象的hashCode值,输出0
System.out.println(Objects.hashCode(null));
// 输出一个null对象的toString,输出"null"
System.out.println(Objects.toString(null));
// 要求第一个参数不能为null,如果为null则引发异常
System.out.println(Objects.requireNonNull(null, "obj参数不能是null!"));
 
 
7.3.3 String、StringBuffer、StringBuilder
String是不可变的
StringBuilder是可变的,但是是线程不安全的
StringBuffer用法同StringBuilder,是线程安全的。
 
StringBuilder sb = new StringBuilder();
// 追加字符串
sb.append("java");//sb = "java"
// 插入
sb.insert(0 , "hello "); // sb="hello java"
// 替换
sb.replace(5, 6, ","); // sb="hello, java"
// 删除
sb.delete(5, 6); // sb="hellojava"
// 反转
sb.reverse(); // sb="avajolleh"
// 输出长度
System.out.println(sb.length()); // 输出9
// 输出容量
System.out.println(sb.capacity()); // 输出16
// 改变StringBuilder的长度,将只保留前面部分
sb.setLength(5); // sb="avajo"
 
7.3.4 Math
 
/*---------三角运算---------*/
// 将弧度转换角度、角度转换为弧度
Math.toDegrees(1.57)
Math.toRadians(90)
 
// 计算反余弦、反正弦、反正切。
Math.acos(1.2)
Math.asin(0.8)
Math.atan(2.3)
 
// 计算三角余弦、正弦、正切
Math.cos(1.57)
Math.sin(1.57 )
Math.tan(0.8 )
 
// 计算值的双曲余弦、双曲正弦、双曲正切。
Math.cosh(1.2 )
Math.sinh(1.2 )
Math.tanh(2.1 )
 
// 将矩形坐标 (x, y) 转换成极坐标 (r, thet));
Math.atan2(0.1, 0.2)
 
/*---------取整运算---------*/
Math.ceil(1.2)    // 2 向上取整。
Math.floor(-1.2 ) // -2 向下取整。
Math.round(2.3 )  // 2 四舍五入取整
Math.round(-2.5 ) // -2 四舍五入取整 遇到0.5向上取整
 
/*---------乘方、开方、指数运算---------*/
 
Math.sqrt(2.3 ) // 计算平方根
Math.cbrt(9) // 计算立方根
Math.hypot(4 , 4) // 返回 sqrt(x2 +y2)
Math.IEEEremainder(5 , 2)// 按照 IEEE 754 标准的规定 进行余数运算
Math.pow(3, 2) // 计算乘方
Math.log(12) // 计算自然对数
Math.log10(9) // 计算底数为 10 的对数。
Math.log1p(9) // 返回参数与 1 之和的自然对数。
 
/*---------符号相关的运算---------*/
Math.abs(-4.5) // 计算绝对值。
Math.copySign(1.2, -1.0)//符号赋值,返回带有第二个浮点数符号的第一个浮点参数。
Math.signum(2.3) // 符号函数;参数为 0则返回 0;大于0返回 1.0;小于0返回 -1.0。
 
/*---------大小相关的运算---------*/
Math.max(2.3 , 4.5) // 找出最大值
Math.min(1.2 , 3.4) // 计算最小值
 
Math.nextAfter(1.2, 1.0)// 返回第一个参数和第二个参数之间 与第一个参数相邻的浮点数。
System.out.println("Math.nextAfter(1.2, 1.0):"+ );
Math.nextUp(1.2 ) // 返回比目标数略大的浮点数
Math.random() // 返回一个伪随机数,该值大于等于 0.0 且小于 1.0。
 
 
7.3.5 Random
Random rand = new Random();
rand.nextBoolean()
rand.nextDouble() // 生成0.0~1.0之间的伪随机double数
rand.nextFloat() // 生成0.0~1.0之间的伪随机float数
rand.nextGaussian() // 生成平均值是 0.0,标准差是 1.0的伪高斯数
rand.nextInt() // 生成一个处于int整数取值范围的伪随机整数
rand.nextInt(26) // 生成0~26之间的伪随机整数
rand.nextLong() // 生成一个处于long整数取值范围的伪随机整数
byte[] buffer = new byte[16];
rand.nextBytes(buffer);// 生成一个随机字节数组
 
种子相同,则生成的数字序列相同
Random r1 = new Random(50);
System.out.println("r1.nextBoolean():\t" + r1.nextBoolean());
System.out.println("r1.nextInt():\t\t" + r1.nextInt());
Random r2 = new Random(50);
System.out.println("r2.nextBoolean():\t" + r2.nextBoolean());
System.out.println("r2.nextInt():\t\t" + r2.nextInt());
 
7.3.6 BigDecimal(精确表示 计算浮点数,float和double不行)
BigDecimal f1 = new BigDecimal("0.05");
BigDecimal f2 = BigDecimal.valueOf(0.01);
BigDecimal f3 = new BigDecimal(0.05);
System.out.println("使用String作为BigDecimal构造器参数:");
System.out.println("0.05 + 0.01 = " + f1.add(f2));
System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
System.out.println("0.05 / 0.01 = " + f1.divide(f2));
System.out.println("使用double作为BigDecimal构造器参数:");
System.out.println("0.05 + 0.01 = " + f3.add(f2));
System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
System.out.println("0.05 / 0.01 = " + f3.divide(f2));
 
 
7.4.1 Date
 
Date d1 = new Date();
Date d2 = new Date(System.currentTimeMillis() + 100); // 获取当前时间之后100ms的时间
 
7.4.2 Calendar
Calendar c = Calendar.getInstance();
c.get(YEAR) // 取出年
c.get(MONTH) // 取出月份
c.get(DATE) // 取出日
c.set(2003 , 10 , 23 , 12, 32, 23); //2003-11-23 12:32:23 // 分别设置年、月、日、小时、分钟、秒
c.add(YEAR , -1); //2002-11-23 12:32:23 // 将Calendar的年前推1年
c.roll(MONTH , -8); //2002-03-23 12:32:23 // 将Calendar的月前推8个月
 
Calendar cal1 = Calendar.getInstance();
cal1.set(2003, 7, 23, 0, 0 , 0); // 2003-8-23
cal1.add(MONTH, 6); //2003-8-23 => 2004-2-23
 
Calendar cal2 = Calendar.getInstance();
cal2.set(2003, 7, 31, 0, 0 , 0); // 2003-8-31
cal2.add(MONTH, 6); // 2003-8-31 => 2004-2-29 // 进位到后月份改为2月,2月没有31日,自动变成29日
 
Calendar cal3 = Calendar.getInstance();
cal3.set(2003, 7, 23, 0, 0 , 0); //2003-8-23
cal3.roll(MONTH, 6); //2003-8-23 => 2003-2-23 // MONTH字段“进位”,但YEAR字段并不增加
 
Calendar cal4 = Calendar.getInstance();
cal4.set(2003, 7, 31, 0, 0 , 0); //2003-8-31 
cal4.roll(MONTH, 6); //2003-8-31 => 2003-2-28 //MONTH字段“进位”后变成2 YEAR字段不会改变,2003年2月只有28天
 
Calendar cal = Calendar.getInstance();
cal.set(MONTH , 13);    // 结果是YEAR字段加1,MONTH字段为1(二月)
 
cal.setLenient(false); // 关闭容错性
cal.set(MONTH , 13);   // 导致运行时异常
 
cal.set(2003 , 7 , 31);  //2003-8-31
cal.set(MONTH , 8);// 将月份设为9,但9月31日不存在。如果立即输出修改,系统将会把cal自动调整到10月1日。
cal.set(DATE , 5);    // 设置DATE字段为5
System.out.println(cal.getTime());    //③  2003-9-5
 
String[] ids = TimeZone.getAvailableIDs();// 取得Java所支持的所有时区ID
TimeZone my = TimeZone.getDefault(); // 获取系统默认时区
my.getID(); // ID:Asia/Shanghai
my.getDisplayName(); //系统默认时区的名称:中国标准时间
TimeZone.getTimeZone("CNT").getDisplayName();// 获取指定ID的时区的名称:纽芬兰标准时间
 
 
7.4.3 Java8 新增的日期、时间包
 
Clock clock = Clock.systemUTC(); // 获取当前Clock
clock.instant() // 通过Clock获取当前时刻
clock.millis() // 获取clock对应的毫秒数,同System.currentTimeMillis()
 
Duration d = Duration.ofSeconds(6000);
System.out.println("6000秒相当于" + d.toMinutes() + "分");
System.out.println("6000秒相当于" + d.toHours() + "小时");
System.out.println("6000秒相当于" + d.toDays() + "天");
 
Clock clock2 = Clock.offset(clock, d); // 在clock基础上增加6000秒,返回新的Clock
System.out.println("当前时刻加6000秒为:" +clock2.instant());// 可看到clock2与clock1相差1小时40分
 
 
Instant instant = Instant.now(); // 获取当前时间
Instant instant2 = instant.plusSeconds(6000); // instant添加6000秒(即100分钟),返回新的Instant
Instant instant3 = Instant.parse("2014-02-23T10:12:35.342Z"); // 根据字符串中解析Instant对象
Instant instant4 = instant3.plus(Duration.ofHours(5).plusMinutes(4));// 在instant3的基础上添加5小时4分钟
Instant instant5 = instant4.minus(Duration.ofDays(5));// 获取instant4的5天以前的时刻
 
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
localDate = LocalDate.ofYearDay(2014, 146); // 获得2014年的第146天 2014-05-26
localDate = LocalDate.of(2014, Month.MAY, 21); // 设置为2014年5月21日
 
LocalTime localTime = LocalTime.now();
localTime = LocalTime.of(22, 33); // 设置为22点33分
localTime = LocalTime.ofSecondOfDay(5503); // 返回一天中的第5503秒  01:31:43
 
 
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime future = localDateTime.plusHours(25).plusMinutes(3); // 当前日期、时间加上25小时3分钟
 
Year year = Year.now(); // 获取当前的年份
year = year.plusYears(5); // 当前年份再加5年
YearMonth ym = year.atMonth(10);// 根据指定月份获取YearMonth
System.out.println("year年10月:" + ym); // 输出XXXX-10,XXXX代表当前年份
ym = ym.plusYears(5).minusMonths(3); // 当前年月再加5年,减3个月
 
MonthDay md = MonthDay.now();
System.out.println("当前月日:" + md); // 输出--XX-XX,代表几月几日
MonthDay md2 = md.with(Month.MAY).withDayOfMonth(23);  --05-23
 
 
7.5 正则表达式
正则表达式规则:http://iprogram.com.cn/Article/Item/110.html
Matcher m = Pattern.compile("((13\\d)|(15\\d))\\d{8}").matcher(str);
while(m.find())
{
// 将所有符合正则表达式的子串(电话号码)全部输出
System.out.println(m.group());
}
 
// 创建一个Pattern对象,并用它建立一个Matcher对象
String regStr = "Java is very easy!";
Matcher m = Pattern.compile("\\w+").matcher(regStr);
while(m.find())
{
System.out.println(m.group() + "子串的起始位置:"+ m.start() + ",其结束位置:" + m.end());
}
 
String[] mails = {
"kongyeeku@163.com" ,
"kongyeeku@gmail.com",
"ligang@crazyit.org",
"wawa@abc.xx"
};
String mailRegEx = "\\w{3,20}@\\w+\\.(com|org|cn|net|gov)";
Pattern mailPattern = Pattern.compile(mailRegEx);
Matcher matcher = null;
for (String mail : mails)
{
if (matcher == null)
{
matcher = mailPattern.matcher(mail);
}
else
{
matcher.reset(mail);
}
String result = mail + (matcher.matches() ? "是" : "不是")+ "一个有效的邮件地址!";
System.out.println(result);
}
 
String[] msgs =
{
"Java has regular expressions in 1.4",
"regular expressions now expressing in Java",
"Java represses oracular expressions"
};
Pattern p = Pattern.compile(" re\\w*");
Matcher matcher = null;
for (int i = 0 ; i < msgs.length ; i++)
{
if (matcher == null)
{
matcher = p.matcher(msgs[i]);
}
else
{
matcher.reset(msgs[i]);
}
System.out.println(matcher.replaceAll("哈哈:)"));
System.out.println(Arrays.toString(msg.split(" ")));
}
 
7.6 国际化
 
// 返回Java所支持的全部国家和语言的数组
Locale[] localeList = Locale.getAvailableLocales();
// 遍历数组的每个元素,依次获取所支持的国家和语言
for (int i = 0; i < localeList.length ; i++ )
{
// 输出出所支持的国家和语言
System.out.println(localeList[i].getDisplayCountry()
+ "=" + localeList[i].getCountry()+ " "
+ localeList[i].getDisplayLanguage()
+ "=" + localeList[i].getLanguage());
}
 
 
7.6.3  mess.properties 完成国际化
Locale myLocale = Locale.getDefault(Locale.Category.FORMAT);// 默认的国家/语言环境
ResourceBundle bundle = ResourceBundle.getBundle("mess" , myLocale);
System.out.println(bundle.getString("hello"));
 
附:Android 国际化
一是app根据系统语言调用对应的资源文件夹,二是在app里面根据用户的需求来更改语言。
前者比较简单,只需求创建对应国家的strings.xml,然后发在对应的文件夹里面就可以了。
app会根据系统语言选择对应的文件夹资源。(图片资源的国际化也是一样的)
后者通过代码让用户自己设置来更改语言。同样需要把strings.xml放到对应的文件夹
 
//切换英文
public void en(View v){
Resources resources = getResources();// 获得res资源对象
Configuration config = resources.getConfiguration();// 获得设置对象
DisplayMetrics dm = resources.getDisplayMetrics();// 获得屏幕参数:主要是分辨率,像素等。
config.locale = Locale.ENGLISH; // 英文
resources.updateConfiguration(config, dm);
finish();//如果不重启当前界面,是不会立马修改的
startActivity(new Intent(this,MainActivity.class));
}
 
//切换中文
public void cn(View v){
Resources resources = getResources();// 获得res资源对象
Configuration config = resources.getConfiguration();// 获得设置对象
DisplayMetrics dm = resources.getDisplayMetrics();// 获得屏幕参数:主要是分辨率,像素等。
config.locale = Locale.CHINA; // 简体中文
resources.updateConfiguration(config, dm);
finish();//如果不重启当前界面,是不会立马修改的
startActivity(new Intent(this,MainActivity.class));
}
 
Android多国语言文件夹:
 
中文(中国):values-zh-rCN
中文(台湾):values-zh-rTW
中文(香港):values-zh-rHK
英语(美国):values-en-rUS
英语(英国):values-en-rGB
英文(澳大利亚):values-en-rAU
英文(加拿大):values-en-rCA
英文(爱尔兰):values-en-rIE
 
英文(印度):values-en-rIN
英文(新西兰):values-en-rNZ
英文(新加坡):values-en-rSG
英文(南非):values-en-rZA
 
阿拉伯文(埃及):values-ar-rEG
阿拉伯文(以色列):values-ar-rIL
保加利亚文:  values-bg-rBG
加泰罗尼亚文:values-ca-rES
捷克文:values-cs-rCZ
丹麦文:values-da-rDK
德文(奥地利):values-de-rAT
德文(瑞士):values-de-rCH
德文(德国):values-de-rDE
德文(列支敦士登):values-de-rLI
希腊文:values-el-rGR
西班牙文(西班牙):values-es-rES
西班牙文(美国):values-es-rUS
芬兰文(芬兰):values-fi-rFI
法文(比利时):values-fr-rBE
法文(加拿大):values-fr-rCA
法文(瑞士):values-fr-rCH
法文(法国):values-fr-rFR
希伯来文:values-iw-rIL
印地文:values-hi-rIN
克罗里亚文:values-hr-rHR
匈牙利文:values-hu-rHU
印度尼西亚文:values-in-rID
意大利文(瑞士):values-it-rCH
意大利文(意大利):values-it-rIT
日文:values-ja-rJP
韩文:values-ko-rKR
立陶宛文:valueslt-rLT
拉脱维亚文:values-lv-rLV
挪威博克马尔文:values-nb-rNO
荷兰文(比利时):values-nl-BE
荷兰文(荷兰):values-nl-rNL
波兰文:values-pl-rPL
葡萄牙文(巴西):values-pt-rBR
葡萄牙文(葡萄牙):values-pt-rPT
罗马尼亚文:values-ro-rRO
俄文:values-ru-rRU
斯洛伐克文:values-sk-rSK
斯洛文尼亚文:values-sl-rSI
塞尔维亚文:values-sr-rRS
瑞典文:values-sv-rSE
泰文:values-th-rTH
塔加洛语:values-tl-rPH
土耳其文:values--r-rTR
乌克兰文:values-uk-rUA
越南文:values-vi-rVN
 
7.6.4 MessageFormat
Locale currentLocale = new Locale("zh","CN"); //构造函数 Locale(String language, String country)  
currentLocale = Locale.getDefault(Locale.Category.FORMAT); // 系统默认的Locale
 
ResourceBundle bundle = ResourceBundle.getBundle("myMess" , currentLocale); // 根据Locale加载语言资源
String msg = bundle.getString("msg"); // 取得已加载的语言资源文件中msg对应消息
MessageFormat.format(msg, "yeeku" , new Date());// 使用MessageFormat为带占位符的字符串传入参数
 
7.6.6 NumberFormat
double db = 1234000.567;
// 创建四个Locale,分别代表中国、日本、德国、美国
Locale[] locales = {Locale.CHINA, Locale.JAPAN, Locale.GERMAN,  Locale.US};
NumberFormat[] nf = new NumberFormat[12];
// 为上面四个Locale创建12个NumberFormat对象
// 每个Locale分别有通用数值格式器、百分比格式器、货币格式器
for (int i = 0 ; i < locales.length ; i++)
{
nf[i * 3] = NumberFormat.getNumberInstance(locales[i]);
nf[i * 3 + 1] = NumberFormat.getPercentInstance(locales[i]);
nf[i * 3 + 2] = NumberFormat.getCurrencyInstance(locales[i]);
}
for (int i = 0 ; i < locales.length ; i++)
{
String tip = i == 0 ? "----中国的格式----" :
i == 1 ? "----日本的格式----" :
i == 2 ? "----德国的格式----" :"----美国的格式----";
System.out.println(tip);
System.out.println("通用数值格式:"+ nf[i * 3].format(db));
System.out.println("百分比数值格式:"+ nf[i * 3 + 1].format(db));
System.out.println("货币数值格式:"+ nf[i * 3 + 2].format(db));
}
 
7.6.7 DateFormat
 
Date dt = new Date();
Locale[] locales = {Locale.CHINA, Locale.US};// 创建两个Locale,分别代表中国、美国
DateFormat[] df = new DateFormat[16];
// 为上面两个Locale创建16个DateFormat对象
for (int i = 0 ; i < locales.length ; i++)
{
df[i * 8] = DateFormat.getDateInstance(SHORT, locales[i]);
df[i * 8 + 1] = DateFormat.getDateInstance(MEDIUM, locales[i]);
df[i * 8 + 2] = DateFormat.getDateInstance(LONG, locales[i]);
df[i * 8 + 3] = DateFormat.getDateInstance(FULL, locales[i]);
df[i * 8 + 4] = DateFormat.getTimeInstance(SHORT, locales[i]);
df[i * 8 + 5] = DateFormat.getTimeInstance(MEDIUM , locales[i]);
df[i * 8 + 6] = DateFormat.getTimeInstance(LONG , locales[i]);
df[i * 8 + 7] = DateFormat.getTimeInstance(FULL , locales[i]);
}
for (int i = 0 ; i < locales.length ; i++)
{
String tip = i == 0 ? "----中国日期格式----":"----美国日期格式----";
System.out.println(tip);
System.out.println("SHORT格式的日期格式:"+ df[i * 8].format(dt));
System.out.println("MEDIUM格式的日期格式:"+ df[i * 8 + 1].format(dt));
System.out.println("LONG格式的日期格式:"+ df[i * 8 + 2].format(dt));
System.out.println("FULL格式的日期格式:"+ df[i * 8 + 3].format(dt));
System.out.println("SHORT格式的时间格式:"+ df[i * 8 + 4].format(dt));
System.out.println("MEDIUM格式的时间格式:"+ df[i * 8 + 5].format(dt));
System.out.println("LONG格式的时间格式:"+ df[i * 8 + 6].format(dt));
System.out.println("FULL格式的时间格式:"+ df[i * 8 + 7].format(dt));
}
 
 
String str1 = "2014-12-12";
String str2 = "2014年12月10日";
 
DateFormat.getDateInstance().parse(str1) // Fri Dec 12 00:00:00 CST 2014
DateFormat.getDateInstance(LONG).parse(str2)// Wed Dec 10 00:00:00 CST 2014
DateFormat.getDateInstance().parse(str2)    // 下面抛出 ParseException异常
 
7.6.8 SimpleDateFormat
 
SimpleDateFormat sdf1 = new SimpleDateFormat("Gyyyy年中第D天");
String dateStr = sdf1.format(new Date()); //如:公元2108年中第101天
 
SimpleDateFormat sdf2 = new SimpleDateFormat("y###MMM##d");
sdf2.parse("14###三月##21") // 将日期字符串解析成日期,输出:Fri Mar 21 00:00:00 CST 2014
 
7.7 Java8新增 DateTimeFormatter
DateTimeFormatter[] formatters = new DateTimeFormatter[]{
// 直接使用常量创建DateTimeFormatter格式器
DateTimeFormatter.ISO_LOCAL_DATE,
DateTimeFormatter.ISO_LOCAL_TIME,
DateTimeFormatter.ISO_LOCAL_DATE_TIME,
// 使用本地化的不同风格来创建DateTimeFormatter格式器
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM),
DateTimeFormatter.ofLocalizedTime(FormatStyle.LONG),
// 根据模式字符串来创建DateTimeFormatter格式器
DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd HH:mm:ss")
};
LocalDateTime date = LocalDateTime.now();
for(int i = 0 ; i < formatters.length ; i++)
{
//不同的格式器 下面两行代码的作用相同
System.out.println(date.format(formatters[i]));
System.out.println(formatters[i].format(date));
}
 
String str1 = "2014==04==12 01时06分09秒";
DateTimeFormatter fomatter1 = DateTimeFormatter.ofPattern("yyyy==MM==dd HH时mm分ss秒");
LocalDateTime dt1 = LocalDateTime.parse(str1, fomatter1); //解析得到 2014-04-12T01:06:09
 
String str2 = "2014$$$四月$$$13 20小时";
DateTimeFormatter fomatter2 = DateTimeFormatter.ofPattern("yyy$$$MMM$$$dd HH小时");
LocalDateTime dt2 = LocalDateTime.parse(str2, fomatter2);//解析得到 2014-04-13T20:00