如何在 Java 中将 TimeStamp 转换为 Date?

在 Java 中获得计数后,如何将‘ timeStamp’转换为 date

我现在的代码如下:

public class GetCurrentDateTime {


public int data() {
int count = 0;
java.sql.Timestamp timeStamp = new Timestamp(System.currentTimeMillis());
java.sql.Date date = new java.sql.Date(timeStamp.getTime());
System.out.println(date);
//count++;


try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/pro", "root", "");


PreparedStatement statement = con.prepareStatement("select * from orders where status='Q' AND date=CURDATE()");
ResultSet result = statement.executeQuery();
while (result.next()) {
// Do something with the row returned.
count++; //if the first col is a count.
}
} catch (Exception exc) {
System.out.println(exc.getMessage());
}


return count;
}
}

这是我的数据库:
enter image description here

这里我得到的输出是2012-08-070,但等效的查询返回3。为什么我得到0?

586077 次浏览

只要使用戳记的 getTime()值作为参数创建一个新的 Date对象即可。

下面是一个例子(我使用了一个当前时间的时间戳示例) :

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);

不确定您试图在查询中选择什么,但是请记住,没有参数的 UNIX_TIMESTAMP()现在返回时间。您可能应该提供一个有效的时间作为参数,或者更改条件。

编辑:

下面是一个基于问题的时间限制查询示例:

PreparedStatement statement = con
.prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
statement.setDate(1, new java.sql.Date(date.getTime()));

编辑: 时间戳列

在使用时间戳的情况下,使用 java.sql.TimestampSetTimestamp (),即:

PreparedStatement statement = con
.prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
Timestamp timestamp = new Timestamp(date.getTime());
statement.setTimestamp(1, timestamp);

首先,您没有利用使用 PreparedStatement的优势。我首先建议你修改你的 PreparedStatement如下:

PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")

然后可以使用 statement.setXX(param_index, param_value)设置各自的值。要转换到 timestamp,请看下面的 javadocs:

PreparedStatement.setTimeStamp()
时间戳

希望这个能帮上忙!

// timestamp to Date
long timestamp = 5607059900000; //Example -> in ms
Date d = new Date(timestamp );


// Date to timestamp
long timestamp = d.getTime();


//If you want the current timestamp :
Calendar c = Calendar.getInstance();
long timestamp = c.getTimeInMillis();
String timestamp="";
Date temp=null;
try {
temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(getDateCurrentTimeZone(Long.parseLong(timestamp)));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int dayMonth=temp.getDate();
int dayWeek=temp.getDay();
int hour=temp.getHours();
int minute=temp.getMinutes();
int month=temp.getMonth()+1;
int year=temp.getYear()+1900;

在 Android 中非常简单,只需使用 Calender 类获取 currentTimeMillis。

Timestamp stamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
Date date = new Date(stamp.getTime());
Log.d("Current date Time is   "  +date.toString());

在 Java 中,只需使用 System.currentTimeMillis ()获取当前时间戳

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date fecha = getDateInTimestamp();

new Date(timestamp.getTime())应该可以工作,但是新的 Java8方法(它可能更优雅、更安全,并且有助于引导您使用新的 time 类)是调用 Date.from(timestamp.toInstant())

(Do not rely on the fact that Timestamp itself is an instance of Date; see explanation in the comments of 另一个答案 .)

    Timestamp tsp = new Timestamp(System.currentTimeMillis());
java.util.Date dateformat = new java.util.Date(tsp.getTime());

我觉得有必要作出回应,因为其他的答案似乎是时区不可知的,这是现实世界的应用程序所不能承受的。要在时间戳和 JVM 使用不同时区时正确进行时间戳到日期的转换,可以使用 Joda Time 的 LocalDateTime (或 Java8中的 LocalDateTime) ,如下所示:

Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());

下面的示例假定时间戳为 UTC (数据库通常是这种情况)。如果时间戳位于不同的时区,请更改 toDate语句的时区参数。

只要:

Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());

我一直在寻找这一点,因为很长一段时间,原来 Eposh converter做到这一点很容易:

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

或者恰恰相反:

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));

尝试使用下面的 Java 代码:

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
DateFormat f1 = new SimpleDateFormat("yyyy/MM/dd");
String d = f.format(date);
String d1 = f1.format(date);
System.out.println(d);
System.out.println(d1);

tl;dr

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
.toEpochSecond()

...

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
.plusDays( 1 )
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
.toEpochSecond()

...

"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "

...

myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )

爪哇时间

您正在使用现在已经被现代 爪哇时间类取代的令人讨厌的旧日期时间类。

显然,您正在数据库中某个整数类型的列中存储某个时刻。真不幸。相反,您应该使用类型为 SQL 标准的 TIMESTAMP WITH TIME ZONE的列。但是,为了这个答案,我们将利用我们所拥有的。

如果您的记录表示分辨率为毫秒的时刻,并且您想要一整天的所有记录,那么我们需要一个时间范围。我们必须有一个开始的时刻和一个停止的时刻。您的查询只有一个日期-时间条件,其中应该有一对。

LocalDate类表示一个仅限于日期的值,不包含一天中的时间和时区。

A time zone is crucial in determining a date. For any given moment, the date varies around the globe by zone. For example, a few minutes after midnight in Paris France is a new day while still “yesterday” in 魁北克蒙特利尔.

如果没有指定时区,JVM 将隐式应用其当前默认时区。该默认值可能随时发生变化,因此结果可能会有所不同。最好明确地将所需/所期望的时区指定为参数。

指定 continent/region格式的 正确的时区名称,例如 America/MontrealAfrica/CasablancaPacific/Auckland。永远不要使用3-4个字母的缩写,如 ESTIST,因为它们是 没有真正的时区,不标准化,甚至不唯一(!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;

如果您想使用 JVM 的当前默认时区,请求它并将其作为参数传递。如果省略,则隐式应用 JVM 的当前默认值。最好是显式的,因为默认值随时可能被 JVM 中任何应用程序的任何线程中的任何代码更改为 在运行时

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Or specify a date. You may set the month by a number, with sane numbering 1-12 for January-December.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

或者,更好的方法是使用预定义的 Month枚举对象,每个对象代表一年中的每个月份。提示: 在整个代码库中使用这些 Month对象,而不是仅仅使用一个整数,这样可以使代码更具有自记录性,确保有效值,并提供 类型安全

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

有了 LocalDate在手,我们接下来需要把它转换成一对时刻,一天的开始和结束。不要以为一天的开始是一天中的00:00:00时间。由于夏时制等异常现象,新的一天可能会在另一个时间开始,比如01:00:00。所以让 java.time 决定一天中的第一个时刻。我们将一个 ZoneId参数传递给 LocalDate::atStartOfDay以查找任何这样的异常。结果是 ZonedDateTime

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

Generally the best approach to defining a span of time is the Half-Open approach where the beginning is 包容性 while the ending is 独家新闻. So a day starts with its first moment and runs up to, but not including, the first moment of the next day.

ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Determine the following date, and ask for the first moment of that day.

Our query for an entire day cannot make use of SQL command BETWEEN. That command is Fully-Closed ([]) (both beginning and ending are inclusive) where as we want Half-Open ([)). We use a pair of criteria >= and <.

你的专栏名字不好。避免各种数据库保留的千字中的任何一个。让我们在这个例子中使用 placed

您的代码应该使用 ?占位符来指定我们的时刻。

String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;

但是我们手头有 ZonedDateTime对象,而您的数据库显然正在存储上面讨论的整数。如果 曾经正确地定义了列,我们可以简单地传递带有任何支持 JDBC 4.2或更高版本的 JDBC 驱动程序的 ZonedDateTime对象。

但是我们需要在几秒钟内得到一个从纪元开始的数字。我将假定你的纪元参考日期是1970年世界协调时的第一个时刻。小心可能的数据丢失,因为 ZonedDateTime类可以达到纳秒级的分辨率。任何小数秒将在以下行中被截断。

long start = zdtStart().toEpochSecond() ;  // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ;

现在我们已经准备好将这些整数传递给上面定义的 SQL 代码。

PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();

当从 ResultSet检索整数值时,可以转换为 Instant对象(始终使用 UTC) ,或者转换为 ZonedDateTime对象(使用指定的时区)。

Instant instant = rs.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

About 爪哇时间

< em > java.time 框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

现在在 maintenance mode中的 尤达时间项目建议迁移到 java.time类。

要了解更多,请参阅 < em > Oracle 教程 。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

从哪里获得 java.time 类?

  • Java SE 8 Java SE 9和更高版本
    • 内置的。
    • 带有捆绑实现的标准 JavaAPI 的一部分。
    • Java9添加了一些次要的特性和修复。
  • Java SE 6 和 < a href = “ https://en.wikipedia.org/wiki/Java _ version _ history # Java _ SE _ 7”rel = “ noReferrer”> < strong > Java SE 7
  • 仿生人
    • Java.time 类的 Android 捆绑包实现的后续版本。
    • For earlier Android, the project adapts 310-后端口 (mentioned above). See 如何使用 Three TenABP...

The < strong > Three Ten-Ultra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and 更多.

假设你有一个预先存在的 java.util.Date date:

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );

你可以使用这个方法获取来自 Timestamp 的日期和特定区域的时区。

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(yourLinuxTimestamp * 1000);
cal.setTimeZone(TimeZone.getTimeZone(timeZone));
Date date = cal.getTime();
}

Date updated = timestamp.toDate();

import java.sql.Timestamp


new Timestamp(1234567890123L)
// java.sql.Timestamp = 2009-02-14 10:31:30.123


(new Timestamp(1234567890123L)).toLocalDateTime().toLocalDate().toString()
// 2009-02-14


与之前投票最多的答案之一有何不同:

import java.time.format.DateTimeFormatter
import java.time.ZoneId
import java.time.ZoneOffset


(DateTimeFormatter.ISO_LOCAL_DATE).withZone(ZoneId.from(ZoneOffset.UTC)).format(new Timestamp(1234567890123L).toInstant())
// String = 2009-02-13

对于我来说,我期待的是“2009-02-14”而不是“2009-02-13”,所以最好的结果对我来说更好。