Date.getTime()返回前一天

时间:2019-02-13 10:14:55

标签: android date kotlin datepicker simpledateformat

我正在以dd-MM-yyyy格式解析日期,并以秒为单位返回(除以1000)。当我将其转换为Unix时间戳时,就会出现问题,因为它将这一秒转换为前一天。我将用代码和示例进行解释:

private fun String.toTimestamp(): String {
    val dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault())
    return (dateFormat.parse(this).time / 1000).toString
}

如果日期为01/02/2019(2019年2月2日),则此方法返回1548975600。如果将其转换为日期(我正在使用this页),它将返回01/31/2019 @ 11:00pm (UTC)。我尝试添加小时,分钟和秒,甚至添加时区,但它总是返回前一天。

另一个例子: 13-02-2019> 1550012400> 02/12/2019 @ 11:00pm (UTC)

日期来自DatePicker,但是如果我以其他方式创建日期,则会返回正确的日期:

(Date().time / 1000).toString()

我已经尝试过使用西班牙语和英语的系统语言,并将Locale更改为Locale.ENGLISHLocale("es", "ES"),结果是相同的。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

java.time和ThreeTenABP

使用Java语法:

private static final DateTimeFormatter dateFormatter
        = DateTimeFormatter.ofPattern("dd-MM-uuuu");

public static final String toTimestamp(String dateString) {
    long epochSecond = LocalDate.parse(dateString, dateFormatter)
            .atStartOfDay(ZoneOffset.UTC)
            .toEpochSecond();
    return String.valueOf(epochSecond);
}

让我们尝试一下:

    System.out.println(toTimestamp("13-02-2019"));
  

1550016000

在链接到的 Epoch Unix时间戳转换器上检查此值:

  

02/13/2019 @ 12:00 am(UTC)

SimpleDateFormat非常麻烦,并且Date早已过时。相反,我使用了Java.time,这是现代的Java日期和时间API。这迫使我们明确给出时区或偏移量。在这种情况下,将其作为预定义常量ZoneOffset.UTC。从而确保我们得到正确的结果,从而解决您的问题。另一个次要优势是,自该纪元以来,我们得到的时间为 seconds ,因此我们不需要除以1000的滑稽外观。

我使用的进口是:

import org.threeten.bp.LocalDate;
import org.threeten.bp.ZoneOffset;
import org.threeten.bp.format.DateTimeFormatter;

问题:我可以在Android上使用java.time吗?

是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(来自API级别26)中,内置了现代API。在这种情况下,是从java.time包(不是org.threeten.bp)包中导入。
  • 在Java 6和7中,获得了ThreeTen反向端口,这是现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 1 :(得分:-1)

//convert seconds to date try below function
public static String convertSecondsToDate(Long date) {
    try {
        long dateInMiliseconds = date *1000;
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(dateInMiliseconds);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
        return simpleDateFormat.format(calendar.getTime());
    } catch (Exception e) {
        return "";
    }
}