从日历中获取格式化字符串

Get formatted string from Calendar

我在 Java 有一个 Calendar 日期。

我需要将其转换为 String 格式:

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

我该怎么做?

非常感谢您的帮助。

通过使用 yyyy-MM-dd'T'HH:mm:ssXXX.

格式调用 Calendar#getTime and format it using a SimpleDateFormat 获取 Date 对象

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

之前

演示:

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

java.time

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

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

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());

Link

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