Grails日期转换报错:java.util.Date无法转换为org.joda.time.LocalDate
解决Grails中Joda LocalDate与java.util.Date类型转换异常的问题
这个错误的根源很清晰:你用SimpleDateFormat把字符串解析成了java.util.Date对象,但你的领域类字段是org.joda.time.LocalDate类型,这两个类属于不同的日期API体系,不能直接赋值转换,所以才会抛出Cannot cast object ... to class org.joda.time.LocalDate的异常。
这里给你两种可行的解决方案:
方案1:把已解析的java.util.Date转成LocalDate
既然你已经得到了java.util.Date对象,可以直接用Joda LocalDate的构造方法完成转换:
def pattern = "yyyy-MM-dd" // 注意:你原来的"yyy-MM-dd"少了一个y,会导致年份解析错误! def startDateStr = [pathtofield].Value def stringToDate = new SimpleDateFormat(pattern).parse(startDateStr) // 关键转换步骤 domainclass.startDate = new LocalDate(stringToDate)
方案2:直接用Joda的格式化工具解析字符串(更推荐)
SimpleDateFormat是线程不安全的,在Grails这类多线程的Web应用里存在隐患。更优雅的方式是直接使用Joda自带的DateTimeFormatter来解析字符串,一步得到LocalDate:
import org.joda.time.format.DateTimeFormat import org.joda.time.LocalDate def pattern = "yyyy-MM-dd" def startDateStr = [pathtofield].Value // 创建Joda的日期格式化器 def dateFormatter = DateTimeFormat.forPattern(pattern) // 直接解析成LocalDate domainclass.startDate = dateFormatter.parseLocalDate(startDateStr)
额外注意点
一定要检查你的日期格式字符串:你写的"yyy-MM-dd"少了一个y,正确的四位年份格式应该是"yyyy-MM-dd",如果用错误的格式,年份会被错误解析(比如2018会被解析为0018),这会导致后续的业务逻辑出错。
内容的提问来源于stack exchange,提问作者Muhammad Owais
相关产品推荐
相关产品推荐

