-3

Calendar在 Java 中有一个日期。

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

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

我该怎么做?

非常感谢你的帮助。

4

2 回答 2

2

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

注意:由于所需字符串的时区偏移量为+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
于 2020-12-01T18:39:02.623 回答
1

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

如果您无法避免获得日历

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

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

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

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

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

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2020-12-01T21:56:54.927 回答