date.getTime()正在返回前一天



我正在使用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。如果将其转换为日期(我正在使用此页面),它将返回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"),结果是相同的。

有什么建议?

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。反过来,这确保我们得到正确的结果,从而解决您的问题。又一个较小的优势是,它给了我们秒以来,所以我们不需要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中获得了三分之一的回向运动,这是现代阶级的后座(JSR 310的Threeten;请参阅底部的链接)。
  • 在(较旧的)Android上使用Threeten Backport的Android版本。它叫做三分之一。并确保通过子弹从org.threeten.bp导入日期和时间类。

链接

  • Oracle教程:解释如何使用Java.Time的日期时间。
  • Java规范请求(JSR)310,首先描述了java.time
  • Threeten Backport Project,java.time的Backport到Java 6和7(JSR-310的Threeten)。
  • Threetenabp,Threeten Backport的Android Edition
  • 问题:如何在Android项目中使用Threetenabp,并具有非常详尽的解释。
//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 "";
    }
}

相关内容

  • 没有找到相关文章

最新更新