在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;
}
}
这是我的数据库:
这里我得到的输出是2012-08-07 0,但等效查询返回3.为什么我得到0?
答案 0 :(得分:169)
只需使用图章的Date
值作为参数创建一个新的getTime()
对象。
这是一个例子(我使用当前时间的示例时间戳):
Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);
答案 1 :(得分:35)
// 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();
答案 2 :(得分:10)
只需:
Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());
答案 3 :(得分:5)
我很久以来一直在寻找这个问题,事实证明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));
答案 4 :(得分:5)
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 )
您正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是现代 java.time 类。
显然,您在数据库中以某种整数类型的列存储片刻。那是不幸的。您应该使用类型的列,例如SQL标准TIMESTAMP WITH TIME ZONE
。但是,对于本答案,我们将使用我们的工作。
如果您的记录代表分辨率为毫秒的时刻,并且您想要一整天的所有记录,那么我们需要一个时间范围。我们必须有一个开始时刻和停止时刻。您的查询只有一个日期时间标准,它应该有一对。
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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.
或指定日期。您可以将月份设置为一个数字,1月至12月的数字为1-12。
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
对象,而不仅仅是整数,以使代码更具自我记录功能,确保有效值,并提供type-safety。
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
手持LocalDate
,我们接下来需要将其转换为一对时刻,即当天的开始和结束。不要假设这一天从00:00:00开始。由于夏令时(DST)等异常,该日可能会在另一个时间开始,例如01:00:00。所以让java.time确定一天的第一时刻。我们将ZoneId
参数传递给LocalDate::atStartOfDay
以查找任何此类异常。结果是ZonedDateTime
。
ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;
通常,定义时间跨度的最佳方法是半开放方法,其中开头是包含,而结尾是独占。因此,有一天从第一个时刻开始,一直到第二天的第一个时刻,但不包括在内。
ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ; // Determine the following date, and ask for the first moment of that day.
我们对一整天的查询无法使用SQL命令BETWEEN
。该命令是完全关闭的([]
)(开头和结尾都包括在内),我们想要半开([)
)。我们使用了一对标准>=
和<
。
您的专栏名称不佳。避免使用各种数据库保留的千字。我们在这个例子中使用placed
。
您的代码应该使用?
占位符来指定我们的时刻。
String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;
但是我们手头有ZonedDateTime
个对象,而你的数据库显然是存储整数,如上所述。如果 正确定义了列,我们可以简单地使用支持JDBC 4.2或更高版本的任何JDBC驱动程序传递ZonedDateTime
对象。
但相反,我们需要在整秒内获得一个从纪元开始的计数。我将假设您的纪元参考日期是1970年UTC的第一个时刻。请注意可能的数据丢失,因为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
个对象(具有指定的时区)。< / p>
Instant instant = rs.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 5 :(得分:4)
首先,您没有利用使用PreparedStatement
的优势。我建议您修改PreparedStatement
,如下所示:
PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")
然后,您可以使用statement.setXX(param_index, param_value)
设置相应的值。要转换为timestamp
,请查看以下javadoc:
PreparedStatement.setTimeStamp()
Timestamp
希望这有帮助!
答案 6 :(得分:3)
不确定您在查询中尝试选择的内容,但请记住,不带参数的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.Timestamp
和PreparedStatement.setTimestamp(),即:
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);
答案 7 :(得分:3)
在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()获取当前时间戳
答案 8 :(得分:3)
new Date(timestamp.getTime())
应该可行,但是新的花哨的Java 8方式(可能更优雅,更安全,以及帮助引导您使用新的时间类)是调用Date.from(timestamp.toInstant())
(不要依赖Timestamp
本身是Date
的实例的事实;请参阅another answer的评论中的解释。)
答案 9 :(得分:3)
Timestamp tsp = new Timestamp(System.currentTimeMillis());
java.util.Date dateformat = new java.util.Date(tsp.getTime());
答案 10 :(得分:3)
我觉得有必要回应,因为其他答案似乎是时区不可知的,而现实世界的应用程序是无法承受的。要在时间戳和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
语句的timezone参数。
答案 11 :(得分:0)
尝试使用这个java代码:
enter code here
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);
答案 12 :(得分:0)
假设您已预先存在java.util.Date date
:
Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );
答案 13 :(得分:0)
您可以使用此方法从特定区域的时间戳和时区获取日期。
public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(yourLinuxTimestamp * 1000);
cal.setTimeZone(TimeZone.getTimeZone(timeZone));
Date date = cal.getTime();
}
答案 14 :(得分:-1)
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;
答案 15 :(得分:-2)
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date fecha = getDateInTimestamp();