Date和String相互转换

本文介绍Java中如何实现字符串和日期类型的相互转换,包括不同格式的处理方式,并提供实用的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java String和Date的转换

String—>Date方法一:

[java]  view plain copy print ?
  1. String dateString = "2012-12-06 ";  
  2. try  
  3. {  
  4.     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");  
  5.     Date date = sdf.parse(dateString);  
  6. }  
  7. catch (ParseException e)  
  8. {  
  9.     System.out.println(e.getMessage());  
  10. }  

String—>Date方法二:

[java]  view plain copy print ?
  1. import java.text.ParseException;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5.   
  6. import org.apache.commons.lang.StringUtils;  
  7.   
  8. /** 
  9.  * 日期Util类 
  10.  *  
  11.  * @author calvin 
  12.  */  
  13. public class DateUtil  
  14. {  
  15.     private static String defaultDatePattern = "yyyy-MM-dd ";  
  16.   
  17.     /** 
  18.      * 获得默认的 date pattern 
  19.      */  
  20.     public static String getDatePattern()  
  21.     {  
  22.         return defaultDatePattern;  
  23.     }  
  24.   
  25.     /** 
  26.      * 返回预设Format的当前日期字符串 
  27.      */  
  28.     public static String getToday()  
  29.     {  
  30.         Date today = new Date();  
  31.         return format(today);  
  32.     }  
  33.   
  34.     /** 
  35.      * 使用预设Format格式化Date成字符串 
  36.      */  
  37.     public static String format(Date date)  
  38.     {  
  39.         return date == null ? " " : format(date, getDatePattern());  
  40.     }  
  41.   
  42.     /** 
  43.      * 使用参数Format格式化Date成字符串 
  44.      */  
  45.     public static String format(Date date, String pattern)  
  46.     {  
  47.         return date == null ? " " : new SimpleDateFormat(pattern).format(date);  
  48.     }  
  49.   
  50.     /** 
  51.      * 使用预设格式将字符串转为Date 
  52.      */  
  53.     public static Date parse(String strDate) throws ParseException  
  54.     {  
  55.         return StringUtils.isBlank(strDate) ? null : parse(strDate,  
  56.                 getDatePattern());  
  57.     }  
  58.   
  59.     /** 
  60.      * 使用参数Format将字符串转为Date 
  61.      */  
  62.     public static Date parse(String strDate, String pattern)  
  63.             throws ParseException  
  64.     {  
  65.         return StringUtils.isBlank(strDate) ? null : new SimpleDateFormat(  
  66.                 pattern).parse(strDate);  
  67.     }  
  68.   
  69.     /** 
  70.      * 在日期上增加数个整月 
  71.      */  
  72.     public static Date addMonth(Date date, int n)  
  73.     {  
  74.         Calendar cal = Calendar.getInstance();  
  75.         cal.setTime(date);  
  76.         cal.add(Calendar.MONTH, n);  
  77.         return cal.getTime();  
  78.     }  
  79.   
  80.     public static String getLastDayOfMonth(String year, String month)  
  81.     {  
  82.         Calendar cal = Calendar.getInstance();  
  83.         // 年  
  84.         cal.set(Calendar.YEAR, Integer.parseInt(year));  
  85.         // 月,因为Calendar里的月是从0开始,所以要-1  
  86.         // cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);  
  87.         // 日,设为一号  
  88.         cal.set(Calendar.DATE, 1);  
  89.         // 月份加一,得到下个月的一号  
  90.         cal.add(Calendar.MONTH, 1);  
  91.         // 下一个月减一为本月最后一天  
  92.         cal.add(Calendar.DATE, -1);  
  93.         return String.valueOf(cal.get(Calendar.DAY_OF_MONTH));// 获得月末是几号  
  94.     }  
  95.   
  96.     public static Date getDate(String year, String month, String day)  
  97.             throws ParseException  
  98.     {  
  99.         String result = year + "- "  
  100.                 + (month.length() == 1 ? ("0 " + month) : month) + "- "  
  101.                 + (day.length() == 1 ? ("0 " + day) : day);  
  102.         return parse(result);  
  103.     }  
  104. }  

Date—>String

[java]  view plain copy print ?
  1. String sdate;  
  2. Date ddate;  
  3. ……  
  4. sdate=(new SimpleDateFormat("yyyy-MM-dd")).format(ddate);  
SimpleDateFormat函数语法:
         G 年代标志符
         y 年
         M 月
         d 日
         h 时 在上午或下午 (1~12)
         H 时 在一天中 (0~23)
         m 分
         s 秒
         S 毫秒
         E 星期
         D 一年中的第几天
         F 一月中第几个星期几
         w 一年中第几个星期
         W 一月中第几个星期
         a 上午 / 下午 标记符
         k 时 在一天中 (1~24)
         K 时 在上午或下午 (0~11)
         z 时区
常见标准的写法"yyyy-MM-dd HH:mm:ss",注意大小写,时间是24小时制,24小时制转换成12小时制只需将HH改成hh,不需要另外的函数。

1:大体思路

  

[html]  view plain  copy
  1. 这种转换要用到java.text.SimpleDateFormat类  
  2.   
  3. 字符串转换成日期类型:  
  4. 方法1:  
  5.   
  6. 也是最简单的方法 Date date=new Date("2008-04-14");  
  7.   
  8. 方法2:  
  9.   
  10. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");//小写的mm表示的是分钟  
  11. String dstr="2008-4-24";  
  12. java.util.Date date=sdf.parse(dstr);  
  13.   
  14.   
  15.   
  16. 日期转换成字符串:  
  17.   
  18. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");  
  19. java.util.Date date=new java.util.Date();  
  20. String str=sdf.format(date);  

 

2:程序实例

[html]  view plain  copy
  1. package test;  
  2. import java.text.DateFormat;  
  3. import java.text.SimpleDateFormat;  
  4. import java.text.ParseException;  
  5. import java.util.Date;  
  6. public class StringOrDate {  
  7.     public static String dateToString(Date date, String type) {  
  8.         String str = null;  
  9.         DateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  10.         if (type.equals("SHORT")) {  
  11.             // 07-1-18  
  12.             format = DateFormat.getDateInstance(DateFormat.SHORT);  
  13.             str = format.format(date);  
  14.         } else if (type.equals("MEDIUM")) {  
  15.             // 2007-1-18  
  16.             format = DateFormat.getDateInstance(DateFormat.MEDIUM);  
  17.             str = format.format(date);  
  18.         } else if (type.equals("FULL")) {  
  19.             // 2007年1月18日 星期四  
  20.             format = DateFormat.getDateInstance(DateFormat.FULL);  
  21.             str = format.format(date);  
  22.         }  
  23.         return str;  
  24.     }  
  25.     public static Date stringToDate(String str) {  
  26.         DateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  27.         Date date = null;  
  28.         try {  
  29.             // Fri Feb 24 00:00:00 CST 2012  
  30.             date = format.parse(str);   
  31.         } catch (ParseException e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.         // 2012-02-24  
  35.         date = java.sql.Date.valueOf(str);  
  36.                                               
  37.         return date;  
  38.     }  
  39.     public static void main(String[] args) {  
  40.         Date date = new Date();  
  41.         System.out.println(StringOrDate.dateToString(date, "MEDIUM"));  
  42.         String str = "2012-2-24";  
  43.         System.out.println(StringOrDate.stringToDate(str));  
  44.     }  



 



<think>好的,我现在要帮用户介绍一下SimpleDateFormat、StringDate之间的转换。首先,我需要确认用户对这三个类的了解程度。可能用户已经知道它们的基本用法,但想更深入地理解如何相互转换,或者在实际应用中需要注意的地方。 首先,我应该从基础开始,解释每个类的作用。Date类代表特定的时间点,而String是日期的文本表示。SimpleDateFormat则是用来格式化解析日期的工具。接下来,用户关心的应该是如何在这三者之间转换,比如DateStringStringDate,以及可能涉及的格式问题。 接下来,我需要考虑用户可能遇到的问题,比如日期格式的字符串模式,比如"yyyy-MM-dd HH:mm:ss",这里要提醒用户注意大小写,比如月份是大写的M,分钟是小写的m,避免混淆。另外,SimpleDateFormat不是线程安全的,这点在实际开发中很重要,尤其是在多线程环境下使用时需要特别注意,可能需要使用ThreadLocal或者每次创建新实例。 然后,用户可能会遇到解析异常的情况,比如输入的字符串与格式不匹配,或者含有非法字符。这时候需要提到ParseException,并建议在代码中进行异常处理,给出示例代码中的try-catch块。 另外,时区的问题也是一个关键点。SimpleDateFormat默认使用系统的时区,如果在处理不同时区的日期时,可能需要显式设置时区,比如setTimeZone方法,避免出现时间偏差。 还有,Java 8之后的DateTimeFormatter可能更推荐使用,但用户可能还在维护旧代码,所以需要说明SimpleDateFormat仍然相关,但新项目建议使用新的API。 在结构上,应该分步骤讲解,比如先讲DateString,再讲StringDate,然后注意事项。每个步骤给出代码示例,并解释关键点。比如在转换时,格式字符串必须匹配,否则会出错。 还要考虑用户可能的应用场景,比如日志处理、数据导入导出中的日期格式转换,这时候正确的格式化解析就非常重要。 最后,总结一下整个转换流程,强调格式一致性异常处理的重要性,确保用户在实际应用中能避免常见的坑。</think>在Java中,`SimpleDateFormat`、`String``Date`之间的转换主要用于日期与字符串的相互格式化,以下是具体转换方法注意事项: --- ### 一、核心类作用 - **`Date`**:表示特定时间点的类(位于`java.util.Date`) - **`String`**:日期的文本表示形式(如 `"2023-08-01 14:30:00"`) - **`SimpleDateFormat`**:用于定义日期格式的类(位于`java.text.SimpleDateFormat`) --- ### 二、转换流程 #### 1. DateString ```java // 定义日期格式(例如:yyyy-MM-dd HH:mm:ss) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 创建Date对象 Date now = new Date(); // 格式化为String String dateStr = sdf.format(now); // 输出结果示例:"2023-08-01 14:30:00" ``` #### 2. StringDate ```java // 定义与字符串匹配的格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 待解析的字符串 String input = "2023-08-01"; // 解析为Date对象 try { Date date = sdf.parse(input); } catch (ParseException e) { e.printStackTrace(); // 处理格式不匹配的情况 } ``` --- ### 三、格式符号对照表 | 符号 | 含义 | 示例 | |------|---------------|------------| | y | 年 | yyyy → 2023 | | M | 月 | MM → 08 | | d | 日 | dd → 01 | | H | 小时(24小时制)| HH → 14 | | h | 小时(12小时制)| hh → 02 | | m | 分钟 | mm → 30 | | s | 秒 | ss → 45 | | S | 毫秒 | SSS → 500 | --- ### 四、关键注意事项 1. **线程安全问题** `SimpleDateFormat`是非线程安全的! ✅ 解决方案: - 每次使用时创建新实例 - 使用`ThreadLocal<SimpleDateFormat>` - 改用Java 8的`DateTimeFormatter`(推荐) 2. **格式严格匹配** 输入字符串必须与格式完全匹配,否则会抛出`ParseException`: ```java // 错误示例:字符串多出空格 new SimpleDateFormat("yyyy-MM-dd").parse("2023-08-01 "); // 报错 ``` 3. **时区处理** 默认使用系统时区,可通过`setTimeZone()`修改: ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("GMT+8")); // 设置为东八区 ``` 4. **月份与分钟区分** - `M`表示月份 - `m`表示分钟 (常见错误:误用`MM`表示分钟) --- ### 五、Java 8+ 替代方案 推荐使用新的日期API(更安全、功能更丰富): ```java // 使用DateTimeFormatter LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String str = now.format(formatter); // DateString LocalDateTime date = LocalDateTime.parse(str, formatter); // StringDate ``` --- ### 总结流程图 ``` Date对象 SimpleDateFormat String │ │ │ │ sdf.format(date) │ │ │─────────────────────────>│ │ │ │ │ │ │ sdf.parse(str) │ │<─────────────────────────│ │ │ │<─────────────────────────────│ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值