如何将 Timestamp 转换为 Date 或 DateTime 对象?
Posted
技术标签:
【中文标题】如何将 Timestamp 转换为 Date 或 DateTime 对象?【英文标题】:How can I convert a Timestamp into either Date or DateTime object? 【发布时间】:2011-11-21 11:42:45 【问题描述】:我正在使用ResultSet.getTimestamp()
从数据库中检索时间戳对象,但我想要一种简单的方法来获取MM/DD/YYYY
格式的日期和HH:MM xx
格式的时间。我正在修补,看起来我可以通过使用 Java 中的 Date 和/或 DateTime 对象来做到这一点。这是最好的方法,还是我什至需要转换时间戳来完成这个?任何建议都会有所帮助。
....
while(resultSet.next())
Timestamp dtStart = resultSet.getTimestamp("dtStart");
Timestamp dtEnd = resultSet.getTimestamp("dtEnd");
// I would like to then have the date and time
// converted into the formats mentioned...
....
....
【问题讨论】:
没有DateTime
类与 Java 1 到 Java 9 捆绑在一起。
【参考方案1】:
LocalDateTime dtStart = rs.getTimestamp("dtStart").toLocalDateTime();
将此 Timestamp 对象转换为代码 LocalDateTime。 转换会创建一个代码 LocalDateTime,它表示 同年、同月、同日、时、分、秒和纳秒 日期时间值作为此代码本地时区的时间戳。
从 1.8 开始
【讨论】:
【参考方案2】: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
。在分别格式化日期和时间之前,我还将检索到的值转换为用户的时区。作为时区,我以 America/Marigot 为例,请提供您自己的时区。当然,如果您不想要任何时区转换,也可以省略。
如果 SQL 中的数据类型只是没有时区的 timestamp
,则改为检索 LocalDateTime
。例如:
ZonedDateTime dtStart = resultSet.getObject("dtStart", LocalDateTime.class)
.atZone(zone);
无论细节如何,我相信你会为dtEnd
做类似的事情。
我不确定HH:MM xx
中的xx
是什么意思。我只是将它留在格式模式字符串中,它以小时和分钟为单位生成 UTC 偏移量,不带冒号。
链接: Oracle tutorial: Date Time 解释如何使用 java.time。
【讨论】:
【参考方案3】:您还可以从时间戳获取 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);
【讨论】:
这是什么DateTime
类?没有这样的类与 Java 捆绑在一起。您是否将 Joda-Time 添加到您的项目中?如果是这样,则无需将麻烦的旧旧日期时间类(如 Calendar
)与 Joda-Time 混合,只需坚持使用 Joda-Time。此外,Joda-Time 项目现在处于维护模式,并建议迁移到现代 java.time 类。 java.time 类取代了旧的日期时间类(Date
、Calendar
等)和 Joda-Time。
DateTime 是 Joda-Time 的类。 OP 询问如何将时间戳转换为日期或日期时间。没错,这里不需要 Calendar 类。【参考方案4】:
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));
【讨论】:
也许 "MM/dd/yyyy' 'HH:mm:ss:S" 更好? 当然,分钟是“mm”,我更正了代码示例。【参考方案5】:java.sql.Timestamp
是java.util.Date
的子类。所以,只是向上吧。
Date dtStart = resultSet.getTimestamp("dtStart");
Date dtEnd = resultSet.getTimestamp("dtEnd");
从现在开始,使用 SimpleDateFormat
并创建 Joda DateTime
应该很简单。
【讨论】:
如果要使用 jodatime,只需DateTime dtStartDT = new DateTime(resultSet.getTimestamp("dtStart"));
。以上是关于如何将 Timestamp 转换为 Date 或 DateTime 对象?的主要内容,如果未能解决你的问题,请参考以下文章
将 CURRENT_DATE 或 UNIX_TIMESTAMP 转换为 Hive 中的字符串(YYYY-DD-MM 格式)
在sql中如何将timestamp转化为date类型,用cast转只有日期部分,没有时间部分,如何