以毫秒为单位的日期与其日历表示形式之间的差异

问题描述 投票:0回答:2

我有两个将日期字符串转换为以毫秒为单位的日期的函数:

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。

java calendar timestamp
2个回答
5
投票

您正在使用

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 时区……您需要自己决定。)


0
投票

tl;博士

在现代 Java 中,使用 java.time

LocalDate
    .parse( "2014-02-17" )
    .atStartOfDay( ZoneId.of( "Asia/Kolkata" ) )
    .toInstant()
    .toEpochMilli()

java.time

在现代 Java 中,使用 java.time 类。

将您的日期文本解析为

LocalDate

LocalDate ld = LocalDate.parse( "2014-02-17" ) ;

确定特定时区中该日期当天的第一时刻,一个

ZonedDateTime
对象。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

调整至 UTC,偏移量为零时-分-秒。通过提取

Instant
对象来完成此操作。

Instant instant = zdt.toInstant() ;

提取自 UTC 1970 年第一个时刻以来所需的毫秒数,即 1970-01-01T00:00Z。

long millis = instant.toEpochMilli() ;
© www.soinside.com 2019 - 2024. All rights reserved.