tl;博士
您可以使用该模式yyyy-MM-dd'T'HH:mm:ssXXX
来获得所需的输出。
java.time
日期时间 APIjava.util
及其格式化 APISimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到现代日期时间 API。
使用现代日期时间 API:
构建一个包含日期、时间和时区偏移信息并对其进行格式化的对象:
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.of(LocalDate.of(2013, 1, 4), LocalTime.of(15, 51, 45),
ZoneOffset.ofHoursMinutes(5, 30));
// Print the default format i.e. the string returned by OffsetDateTime#toString
System.out.println(odt);
// Custom format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
System.out.println(dtf.format(odt));
}
}
输出:
2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30
如您所见,默认格式的输出和使用 a 的输出DateTimeFormatter
是相同的。但是,这里有一个问题:如果是,则省略秒和秒的小数部分,即如果上面代码中的时间是,则默认格式的输出将是。如果您需要像这次这样的字符串,则必须使用带有所需模式的 a 。OffsetDateTime#toString
0
LocalTime.of(15, 0, 0)
2013-01-04T15:00+05:30
2013-01-04T15:00:00+05:30
DateTimeFormatter
解析和格式化:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtfForInputString = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
OffsetDateTime odt = OffsetDateTime.parse("2013-01-04T15:51:45+0530", dtfForInputString);
// Print the default format i.e. the string returned by OffsetDateTime#toString
System.out.println(odt);
// Custom format
DateTimeFormatter dtfCustomOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
System.out.println(dtfCustomOutput.format(odt));
}
}
输出:
2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30
使用旧版 API:
为给定的时区偏移量构建一个日期时间对象并对其进行格式化:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+05:30"));
calendar.set(2013, 0, 4, 15, 51, 45);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
Date date = calendar.getTime();
System.out.println(sdf.format(date));
}
}
输出:
2013-01-04T15:51:45+05:30
该类Calendar
使用UTC
(或GMT
)作为其默认时区,因此,除非您使用它指定时区,否则它将java.util.Date
返回UTC
.
同样,SimpleDateFormat
该类也UTC
用作其默认时区,因此,除非您使用它指定时区,否则它将String
返回UTC
.
解析和格式化:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdfForInputString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
Date date = sdfForInputString.parse("2013-01-04T15:51:45+0530");
SimpleDateFormat sdfCustomOutput = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
sdfCustomOutput.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
System.out.println(sdfCustomOutput.format(date));
}
}
输出:
2013-01-04T15:51:45+05:30