- 根据jdk帮助文档:
日期和时间模式规定元:
日期和时间格式由日期和时间模式字符串指定。 在日期和时间模式字符串中,从'A'
到'Z'
和从'a'
到'z'
的非引号的字母被解释为表示日期或时间字符串的组件的模式字母。 可以使用单引号( '
)引用文本,以避免解释。 "''"
代表单引号。 所有其他字符不被解释; 在格式化过程中,它们只是复制到输出字符串中,或者在解析过程中与输入字符串匹配。
- 模式字母通常重复,因为它们的数字确定了准确的表示:
- Text:对于格式化,如果模式字母的数量是4以上,则使用完整的形式; 否则,如果有的话,使用简短或缩写形式。 对于解析,两种形式都是接受的,与模式字母的数量无关。
- Number:对于格式化,模式字母的数量是最小位数,而较短的数字将零填充到此数量。 对于解析,模式字母的数量将被忽略,除非需要分隔两个相邻的字段。
- Year:如果格式化程序的Calendar是公历,则应用以下规则。
- 对于格式化,如果模式字母数为2,那么年份将被截断为2位数; 否则被解释为number 。
- 对于解析,如果模式字母的数量大于2,则年份将按字面解释,而不管数字的数量。 所以使用“MM / dd / yyyy”模式,“01/11/12”解析到公元12年1月11日
- 为了使用缩写年份模式(“y”或“yy”)进行解析,
SimpleDateFormat
必须解释相对于某个世纪的缩写年份。 它是通过将日期调整为在创建SimpleDateFormat
实例之后的80年之前和20年之后进行的。 例如,使用1997年1月1日创建的“MM / dd / yy”模式和SimpleDateFormat
实例,字符串“01/11/12”将被解释为2012年1月11日,而字符串“05/04 / 64“将被解释为1964年5月4日。在解析期间,只有由Character.isDigit(char)定义的两个数字组成的字符串将被解析为默认世纪。 任何其他数字字符串,例如一位数字字符串,三位或三位以上数字字符串,或两位数字字符串(不全部为数字)(例如“-1”),均按字面解释。 所以“01/02/3”或“01/02/003”的解析方式与公元3年1月2日相同。 同样,“01/02 / -3”在公元前4年1月2日被解析。 - 否则,将应用日历系统特定的表单。 对于格式化和解析两者,如果模式字母数为4以上,则使用特定日历long form 。 否则,使用一个特定日历short or abbreviated form 。
一:String->Date,(借助SimpleDateFormat中的parse函数)
示例代码:
package day_08;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StrtransferDate {
public static void main(String[] args) throws ParseException {
// parse()函数,这个函数是SimpleDateFormat的
String str="2016-06-06 01:02:03";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
}
}
二:Date->String(借助SimpleDateFormat中的format函数)
示例代码: (部分代码来自于:)
public static void main(String[] args) throws ParseException {
//必须明确,SimpleDateFormat只是一个规定格式的作用。
SimpleDateFormat CeshiFmt1=new SimpleDateFormat("Gyyyy年MM月dd日 HH时mm分ss秒");
SimpleDateFormat CeshiFmt2=new SimpleDateFormat("yyyy/MM/dd HH:mm");
SimpleDateFormat CeshiFmt3=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat CeshiFmt4=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
SimpleDateFormat CeshiFmt5=new SimpleDateFormat("yyyy/MM/dd E");
SimpleDateFormat CeshiFmt6=new SimpleDateFormat(
"一年中的第 D 天 ,第w个星期 ,一个月中第W个星期 ,k时 z时区");
Date now=new Date();
String str1=CeshiFmt1.format(now); // 规定格式的Date转换为String
String str2=CeshiFmt2.format(now);
String str3=CeshiFmt3.format(now);
String str4=CeshiFmt4.format(now);
String str5=CeshiFmt5.format(now);
String str6=CeshiFmt6.format(now);
}
总结:看着知识点比较碎,但是两个转换就是SimpleDateFormat的对象调用相应的函数(SimpleDateFormat规定好格式),调用函数的参数位置传入待转换的数据,函数的返回值填写目标类型的对象即可。
补一个工具类的代码:实现了String和Date的互相转换
//转换工具类代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class transfer {
private transfer(){} //设置为private,防止创建对象,让其作为工具类
public String DateToString(Date date, String format){
SimpleDateFormat sdf=new SimpleDateFormat(format);
String s=sdf.format(date);
return s;
}
public Date StringToDate(String str,String format) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat(format);
Date date=sdf.parse(str); //这里得Alt+enter补全throws
}
}
//测试类代码
package day_08;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class test {
public static void main(String[] args) throws ParseException {
// 测试date转为String
Date date=new Date();
String format="yyyy-MM-dd";
String str=transfer.DateToString(date,format);
System.out.println(str);
// 测试String转为Date
String str1="2000-01-02";
Date date1=transfer.StringToDate(str1,format);
System.out.println(date1);
}
}
结果:
2021-02-02
Sun Jan 02 00:00:00 CST 2000