如何将时间戳转换为Date或DateTime对象?

时间:2011-09-20 22:13:22

标签: java datetime date jdbc timestamp

我正在使用ResultSet.getTimestamp()从数据库中检索时间戳对象,但我想要一种简单的方法,以MM/DD/YYYY的格式获取日期,时间格式为{{ 1}}。我正在修修补补,看起来好像我可以通过在Java中使用Date和/或DateTime对象来做到这一点。这是最好的方法,还是我甚至需要转换时间戳来完成这个?任何建议都会有所帮助。

HH:MM xx

4 个答案:

答案 0 :(得分:21)

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTest {

    public static void main(String[] args) {
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        Date date = new Date(timestamp.getTime());

        // S is the millisecond
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy' 'HH:mm:ss:S");

        System.out.println(simpleDateFormat.format(timestamp));
        System.out.println(simpleDateFormat.format(date));
    }
}

答案 1 :(得分:15)

java.sql.Timestampjava.util.Date的子类。所以,只是向上翻。

Date dtStart = resultSet.getTimestamp("dtStart");
Date dtEnd = resultSet.getTimestamp("dtEnd");
从现在开始,

使用SimpleDateFormat并创建Joda DateTime应该是直截了当的。

答案 2 :(得分:1)

java.time

现代答案:使用现代Java日期和时间API java.time进行日期和时间工作。早在2011年,使用Timestamp类是正确的,但是自JDBC 4.2起,不再建议使用。

为您的工作,我们需要一个时区和几个格式化程序。我们也可以将它们声明为静态的:

static ZoneId zone = ZoneId.of("America/Marigot");
static DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd/uuuu");
static DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm xx");

现在代码可以是例如:

    while(resultSet.next()) {
        ZonedDateTime dtStart = resultSet.getObject("dtStart", OffsetDateTime.class)
                 .atZoneSameInstant(zone);

        // I would like to then have the date and time
        // converted into the formats mentioned...
        String dateFormatted = dtStart.format(dateFormatter);
        String timeFormatted = dtStart.format(timeFormatter);
        System.out.format("Date: %s; time: %s%n", dateFormatted, timeFormatted);
    }

示例输出(使用您询问问题的时间):

日期:2011年9月20日;时间:18:13 -0400

建议在数据库中使用timestamp with time zone作为时间戳记。如果这是您需要的,请像我在代码中所做的那样检索一个OffsetDateTime。我还将在分别格式化日期和时间之前将检索到的值转换为用户的时区。以我提供的美国/马里戈特为例,请提供您自己的时区。当然,如果您不想要时区,也可以不进行时区转换。

如果SQL中的数据类型仅为无时区的timestamp,请改为检索LocalDateTime。例如:

        ZonedDateTime dtStart = resultSet.getObject("dtStart", LocalDateTime.class)
                 .atZone(zone);

无论细节如何,我都相信您会为dtEnd做类似的事情。

我不确定xx中的HH:MM xx是什么意思。我只是将其留在格式模式字符串中,该字符串会产生以小时和分钟为单位的UTC偏移量,而没有冒号。

链接: Oracle tutorial: Date Time解释了如何使用java.time。

答案 3 :(得分:0)

您还可以从时间戳中获取DateTime对象,包括当前的夏令时:

public DateTime getDateTimeFromTimestamp(Long value) {
    TimeZone timeZone = TimeZone.getDefault();
    long offset = timeZone.getOffset(value);
    if (offset < 0) {
        value -= offset;
    } else {
        value += offset;
    }
    return new DateTime(value);
}