我有两个将日期字符串转换为以毫秒为单位的日期的函数:
public static long convertYYYYMMDDtoLong(String date) throws ParseException {
SimpleDateFormat f = new SimpleDateFormat("yyyy-mm-dd");
Date d = f.parse(date);
long milliseconds = d.getTime();
return milliseconds;
}
如果我运行这个函数,我会得到以下结果:
long timeStamp = convertYYYYMMDDtoLong("2014-02-17");
System.out.println(timeStamp);
它打印:
1389909720000
现在,如果我运行以下代码:
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timeStamp);
System.out.println(cal.getTime());
打印出来:
Fri Jan 17 00:02:00 IST 2014
为什么我的日期移了一个月?怎么了?
P.S:我的问题是我需要将表示为
long
的日期映射到另一个仅接受Calendar
格式的第三方API。
您正在使用
mm
,这是分钟,而不是几个月。您想要 yyyy-MM-dd
作为格式字符串。
不清楚为什么你不直接从你的方法返回
Calendar
,请注意:
private static final TimeZone UTC = TimeZone.getTimeZone("Etc/UTC")
public static Calendar convertYYYYMMDDtoCalendar(String text) throws ParseException {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
format.setTimeZone(UTC);
Calendar calendar = new GregorianCalendar(UTC);
calendar.setDate(format.parse(text));
return calendar;
}
(假设您想要 UTC 时区……您需要自己决定。)
在现代 Java 中,使用 java.time。
LocalDate
.parse( "2014-02-17" )
.atStartOfDay( ZoneId.of( "Asia/Kolkata" ) )
.toInstant()
.toEpochMilli()
在现代 Java 中,使用 java.time 类。
LocalDate
。
LocalDate ld = LocalDate.parse( "2014-02-17" ) ;
ZonedDateTime
对象。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
Instant
对象来完成此操作。
Instant instant = zdt.toInstant() ;
提取自 UTC 1970 年第一个时刻以来所需的毫秒数,即 1970-01-01T00:00Z。
long millis = instant.toEpochMilli() ;