如何修改Calendar对象格式?及将指定字符串转为目标格式Calendar对象
解析字符串为Calendar对象并处理格式化问题
我来帮你搞定这个日期转换和格式化的需求,分两部分详细说明:
一、将输入字符串转换为指定时间的Calendar对象
首先,你的输入字符串是Thu May 10 15:48:23 IST 2018,目标要得到包含2018-05-10 15:48:23.84信息的Calendar对象——注意原字符串没有毫秒部分,所以需要手动设置毫秒值为84。
推荐:使用Java 8+ 新API(更简洁、线程安全)
Java 8之后的java.time包彻底解决了旧日期API的痛点,我们可以先把字符串解析为带时区的ZonedDateTime,再转成Calendar:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.TimeZone; public class DateDemo { public static void main(String[] args) { String inputStr = "Thu May 10 15:48:23 IST 2018"; // 定义匹配输入字符串的格式 DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"); // 解析时指定IST对应的时区(Asia/Kolkata),避免时区混乱 ZonedDateTime zonedDateTime = ZonedDateTime.parse(inputStr, inputFormatter.withZone(TimeZone.getTimeZone("Asia/Kolkata").toZoneId())); // 转换为Calendar对象 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Kolkata")); calendar.setTimeInMillis(zonedDateTime.toInstant().toEpochMilli()); // 手动设置毫秒值为84(原字符串没有这部分,必须手动添加) calendar.set(Calendar.MILLISECOND, 84); } }
兼容旧版本:使用Calendar + SimpleDateFormat
如果你的项目还在使用Java 8之前的版本,用传统的SimpleDateFormat来解析:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; public class OldDateDemo { public static void main(String[] args) throws ParseException { String inputStr = "Thu May 10 15:48:23 IST 2018"; SimpleDateFormat inputFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); // 一定要指定时区,否则可能会用本地时区解析,导致时间错误 inputFormat.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata")); // 先解析成Date,再转成Calendar Calendar calendar = Calendar.getInstance(); calendar.setTime(inputFormat.parse(inputStr)); // 设置毫秒为84 calendar.set(Calendar.MILLISECOND, 84); } }
二、关于“修改Calendar对象的格式”
这里要纠正一个常见误解:Calendar对象本身不存储任何格式信息,它只是一个用来存储年、月、日、时、分、秒、毫秒等时间字段的容器。所谓的“修改格式”,其实是指把Calendar对象转换成你想要的格式的字符串,这需要用到格式化工具。
用Java 8+ DateTimeFormatter格式化
// 假设已经有了上面的calendar对象 DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"); // 把Calendar的时间转成LocalDateTime,再格式化 String formattedStr = outputFormatter.format( LocalDateTime.ofInstant( Instant.ofEpochMilli(calendar.getTimeInMillis()), ZoneId.of("Asia/Kolkata") ) ); System.out.println(formattedStr); // 输出:2018-05-10 15:48:23.84
用传统SimpleDateFormat格式化
// 假设已经有了calendar对象 SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS"); outputFormat.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata")); String formattedStr = outputFormat.format(calendar.getTime()); System.out.println(formattedStr); // 输出:2018-05-10 15:48:23.84
自定义格式的小技巧
你可以通过修改格式字符串来调整输出样式,常用的模式字符:
yyyy:4位年份(比如2018)MM:2位月份(01-12)dd:2位日期(01-31)HH:24小时制小时(00-23)hh:12小时制小时(01-12)mm:分钟(00-59)ss:秒(00-59)SS:毫秒(00-99)
比如你想输出2018/05/10 下午03:48,就用yyyy/MM/dd ahh:mm作为格式字符串。
内容的提问来源于stack exchange,提问作者ABHISHEK KUMAR
相关产品推荐
相关产品推荐

