从时间戳中仅获取日期

13

这是我的函数,我传递了一个时间戳,我只需要从时间戳中返回日期而不是小时和秒。使用以下代码,我得到的结果是-

private String toDate(long timestamp) {
        Date date = new Date (timestamp * 1000);
        return DateFormat.getInstance().format(date).toString();
}

这是我得到的输出。

11/4/01 11:27 PM

但我只需要像这样的日期

2001-11-04

有什么建议吗?


对于新读者,我建议您不要使用DateSimpleDateFormat。这些类设计得很差,并且已经过时,后者尤其引起麻烦。相反,请使用ZoneIdZonedDateTimeDateTimeFormatter,它们都来自于Java时间和日期API的现代版-java.time - Ole V.V.
4个回答

21

使用SimpleDateFormat代替:

private String toDate(long timestamp) {
    Date date = new Date(timestamp * 1000);
    return new SimpleDateFormat("yyyy-MM-dd").format(date);
}

更新: Java 8 解决方案:

private String toDate(long timestamp) {
    LocalDate date = Instant.ofEpochMilli(timestamp * 1000).atZone(ZoneId.systemDefault()).toLocalDate();
    return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}

感谢s106mo的回答。我还有一个疑问,是否有办法通过我上面编写的同一函数始终获取昨天的日期?因为这是我的第二个要求。 - AKIWEB
1
我理解的是:toDate方法应该根据当前时间戳提供昨天的日期?那么你可以按照以下方式计算昨天的日期:Date date = new Date(timestamp - TimeUnit.DAYS.toMillis(1)); - s106mo
为了获取时间信息,可以使用以下代码: LocalDateTime date = Instant.ofEpochMilli(timestamp * 1000L).atZone(ZoneId.systemDefault()).toLocalDateTime(); try{ return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss a")); } - yolob 21
与其自己编写格式化程序,您可能更愿意使用内置的 DateTimeFormatter.ISO_LOCAL_DATE - Ole V.V.

2
您可以使用此代码以获得所需的结果。
protected Timestamp timestamp = new Timestamp(Calendar.getInstance().getTimeInMillis());


protected String today_Date=timestamp.toString().split(" ")[0];

1

java.time

java.util日期时间API及其格式化API SimpleDateFormat 已经过时且容易出错。建议完全停止使用它们,并切换到现代日期时间API*

此外,以下是来自Joda-Time首页的通知:

请注意,从Java SE 8开始,用户被要求迁移到java.time(JSR-310)- JDK的核心部分,用于替换此项目。

使用现代日期时间API java.time 的解决方案:

您可以使用Instant#ofEpochSecond来将给定的timestamp转换为Instant,然后使用LocalDate.ofInstant将获得的Instant转换为LocalDate

演示:

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(toDate(1636120105L));
    }

    static LocalDate toDate(long timestamp) {
        return LocalDate.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault());
    }
}

输出:

2021-11-05

在线演示

教程:日期时间了解有关现代日期时间 API 的更多信息。查看此答案此答案,以了解如何在 JDBC 中使用java.time API。


如果您正在为 Android 项目工作,并且您的 Android API 级别仍未符合 Java-8,请查看 通过解糖获得的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供了对 java.time 的支持。

1
关于时间(读作过期),很高兴有一个纯Java.time的答案来回答这个经常被访问的问题。非常感谢。 - Ole V.V.
这就是Java 9中引入LocalDate.ofInstant()的方便之处。 - Ole V.V.

0

Joda-Time

Joda-Time库提供了一个LocalDate类,用于表示仅包含日期值而没有任何时间或时区的值。

时区

确定日期需要一个时区。巴黎午夜后的瞬间意味着比蒙特利尔同步瞬间晚一天的日期。如果您忽略指定时区,则应用JVM的当前默认时区 - 这可能不是您想要的结果。

示例代码

long millisecondsSinceUnixEpoch = ( yourNumberOfSecondsSinceUnixEpoch * 1000 ); // Convert seconds to milliseconds.
DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
LocalDate localDate = new LocalDate( millisecondsSinceUnixEpoch, timeZone );
String output = localDate.toString(); // Defaults to ISO 8601 standard format, YYYY-MM-DD.

前一天

根据评论要求,获取前一天的日期。

LocalDate dayBefore = localDate.minusDays( 1 );

转换为j.u.Date

应该避免使用java.util.Date和.Calendar类,因为它们往往会引起问题。但如果需要,你可以进行转换。

java.util.Date date = localDate.toDate(); // Time-of-day set to earliest valid for that date.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接