You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:14:56