如何转换“时间戳”,以date
后,我得到在java中的计数?
我当前的代码如下:
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?
只是做一个新的Date
,贴邮票的对象getTime()
值作为参数。
这里有一个例子(我用的当前时间的一个例子时间戳):
Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);
// 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();
只是:
Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());
因为很长一段时间我一直在找这个,原来, Eposh转换器很容易做的:
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));
TL;博士
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
您正在使用的是现在传统麻烦旧日期时间类,由现代java.time类取代。
显然,你在某个整数类型的列存储数据库中的一个瞬间。 这是不幸的。 您应该改为使用类型的列,如SQL标准的TIMESTAMP WITH TIME ZONE
。 但是,对于这个答案,我们将与我们有什么工作。
如果您的记录表示时刻与毫秒的分辨率,并且要一整天的所有记录,那么我们就需要一个时间范围。 我们必须有一个开始时刻和停止时刻。 您的查询只有一个日期,时间标准,它应该有一个对。
该LocalDate
类表示没有时间一天和不同时区的日期,唯一的价值。
时区是在确定的日期是至关重要的。 对于任何给定的时刻,日期由区全球各地的变化。 例如,在午夜后几分钟法国巴黎是新的一天,同时还“昨天”在蒙特利尔魁北克 。
如果没有指定时区,JVM的隐式应用当前默认时区。 该默认可以在任何时刻都在变化,因此您的结果可能会有所不同。 最好明确指定所需/预期的时区作为参数。
指定适当的时区名称 ,格式为continent/region
,如America/Montreal
, Africa/Casablanca
,或Pacific/Auckland
。 切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,不规范,甚至不是唯一的(!)。
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一月至十二月。
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分时天不要以为一天开始。 由于异常,如夏令时(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
在手的对象,而你的数据库是很明显存储整数如上所述。 如果你定义了你的专栏正确,我们可以简单地通过ZonedDateTime
与任何JDBC驱动程序支持JDBC 4.2或更高版本的对象。
而是我们需要得到一个计数从历元全部按秒计算。 我会假设你的历元基准日期是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
对象(有指定的时区)。
Instant instant = rs.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
关于java.time
该java.time框架是建立在Java 8和更高版本。 这些类取代麻烦的老传统日期时间类,如java.util.Date
, Calendar
,和SimpleDateFormat
。
该乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。
要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。
从哪里获取java.time类?
- 的Java SE 8 , Java SE的9 ,后来
- 内置。
- 具有捆绑实现标准Java API的一部分。
- Java的9增加了一些小的功能和修复。
- Java SE 6中和Java SE 7中
- 多的java.time功能后移植到Java 6和7在ThreeTen-反向移植 。
- Android的
- 后来版本的java.time类的Android束实现的。
- 对于早期的Android,在ThreeTenABP项目适应ThreeTen -反向移植 (如上所述)。 请参阅如何使用ThreeTenABP ... 。
该ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
首先,你不利用利用的优势PreparedStatement
。 我首先建议你修改你PreparedStatement
如下:
PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")
然后,您可以使用statement.setXX(param_index, param_value)
设定相应的值。 对于转换为timestamp
,看看下面的javadoc:
了PreparedStatement.setTimestamp()
时间戳
希望这可以帮助!
不知道你想在查询中选择,但要记住的是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);
new Date(timestamp.getTime())
应该工作,但新奇特的Java 8路(这可能是更优雅,更类型安全,以及帮助指引你使用新的时间类)是调用Date.from(timestamp.toInstant())
(不要依赖于一个事实,即Timestamp
本身就是一个实例Date
;看到的评论解释另一个答案 。)
Timestamp tsp = new Timestamp(System.currentTimeMillis());
java.util.Date dateformat = new java.util.Date(tsp.getTime());
在Android中它非常简单。只是使用日历类来获得的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的()来得到当前的时间戳
我觉得有必要作出回应,因为其他的答案似乎是时区无关,其实际的应用程序无法承受如此。 为了使时间戳最新的正确转换时的时间戳和JVM使用不同的时区,你可以使用约达时间的LocalDateTime(或LocalDateTime在Java8)是这样的:
Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());
下面的示例假定时间戳为UTC(如通常使用数据库的情况下)。 如果您的时间戳在不同的时区,改变的时区参数toDate
声明。
尝试使用这个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);
假设你有一个预先存在的java.util.Date date
:
Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );
您可以使用此方法来从时间戳和特定地区的时区的获取日期。
public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(yourLinuxTimestamp * 1000);
cal.setTimeZone(TimeZone.getTimeZone(timeZone));
Date date = cal.getTime();
}
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;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date fecha = getDateInTimestamp();