【问题标题】:Get formatted string from Calendar从日历中获取格式化字符串
【发布时间】:2021-03-13 17:26:09
【问题描述】:

我在 Java 中有一个 Calendar 日期。

我需要用这种格式将它转换成String

2020-12-29T00:00:00+01:00

我该怎么做?

非常感谢您的帮助。

【问题讨论】:

  • 你能解释一下“我在 Java 中有一个日历日期”是什么意思吗?
  • 我在 Java 中有一个 Calendar 日期。 如果有任何方法可以避免这种情况。 Calendar 类设计不佳且早已过时。而是使用来自java.time, the modern Java date and time APIZonedDateTime

标签: java date formatdatetime


【解决方案1】:

通过调用Calendar#getTime 获取Date 对象,并使用SimpleDateFormat 格式化它,格式为yyyy-MM-dd'T'HH:mm:ssXXX

注意:由于所需字符串的时区偏移量为+01:00 小时,因此请确保在调用SimpleDateFormat#format 之前将SimpleDateFormat 对象的时区设置为TimeZone.getTimeZone("GMT+1")

演示:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+1"));
        Date date = calendar.getTime();
        String formatted = sdf.format(date);
        System.out.println(formatted);
    }
}

另一个例子:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        String dateTimeString = "2020-12-29T00:00:00+01:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        Date obj = sdf.parse(dateTimeString);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(obj);

        // Formatting this calendar object
        Date date = calendar.getTime();
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+1"));
        String formatted = sdf.format(date);
        System.out.println(formatted);
    }
}

输出:

2020-12-29T00:00:00+01:00

【讨论】:

  • 谢谢!!!第一个示例返回异常,但第二个示例完美运行。
  • @Mauraglia - 不客气。我再次检查了第一个示例,它工作正常。唯一的事情是它为当前的日期时间创建了一个Calendar 对象,这是我为演示而特意选择的。有兴趣的可以查看this。无论如何,我很高兴你的问题得到了解决。
【解决方案2】:

java.time

我建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。

这是您所需格式的格式化程序:

private static final DateTimeFormatter formatter
        = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX");

我们可以这样做:

    ZoneId zone = ZoneId.of("Asia/Barnaul");
    ZonedDateTime dateTime
            = LocalDate.of(2020, Month.DECEMBER, 29).atStartOfDay(zone);
    String formatted = dateTime.format(formatter);
    System.out.println(formatted);

此示例 snipoet 的输出为:

2020-12-29T00:00:00+07:00

如果您无法避免获得日历

如果您从旧 API 获取 Calendar 对象,而您现在无法升级到 java.time,请将其转换为 ZonedDateTime。几乎可以肯定它确实是 GregorianCalendar(或者格式化成该格式没有多大意义),这使得转换变得简单。

    Calendar yourCalendar = getCalendarFromLegacyApi();
    ZonedDateTime dateTime
            = ((GregorianCalendar) yourCalendar).toZonedDateTime();

其余的和以前一样,输出也是。

如果您需要考虑Calendar 不是GregorianCalendar 的可能性,请改用这个稍微复杂的转换:

    ZonedDateTime dateTime = yourCalendar.toInstant()
            .atZone(yourCalendar.getTimeZone().toZoneId());

链接

Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2015-05-13
    • 2018-03-13
    • 1970-01-01
    相关资源
    最近更新 更多