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


105

date在Java中获得计数后,如何将“ timeStamp”转换为?

我当前的代码如下:

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?



您能否向我们展示表格数据的示例?
oldrinb 2012年

日期(1344255451,1344255537,1344312502)和状态为(Q,Q,Q)
克里希纳·


这个问题的标题是一条红鲱鱼。真正的问题是不正确使用PreparedStatement语法错误的a 。您不能在Java字符串的文本中嵌入Java变量。而是嵌入?SQL字符串中,然后调用set方法以将值传递给PreparedStatement。请参见Sujay的正确答案tenorsax的答案
罗勒·布尔克

Answers:


188

只需Date使用图章的getTime()值作为参数创建一个新对象。

这是一个示例(我使用当前时间的示例时间戳):

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

@ vs06是什么让您认为它已被弃用?最新的Java 7和8文档都另有说明(docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime()docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime--
亚历科尔曼

4
如果时间戳时区和JVM时区不同,这将产生错误的结果。
罗伯特·穆加塔罗夫'16

例如,如何将其格式化为2014年3月14日?
shurrok

6
我讨厌ppl在其答案中使用库,并希望每个人都知道如何导入它们:/
Sodj

38
// 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();

为什么将它乘以1000?
Sharpless512

3
因为日期的初始化以毫秒为单位,而时间戳以秒为单位!其他所有转换都一样!很好 ?
VincentLamoute


7

很久以来我一直在寻找它,事实证明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));

6

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 )

java.time

您正在使用麻烦的旧日期时间类,这些类现在已被遗留,被现代的java.time类取代。

显然,您是在数据库中某个整数类型的列中存储一个时刻。那是不幸的。相反,您应该使用诸如SQL-standard之类的列TIMESTAMP WITH TIME ZONE。但是,对于这个答案,我们将使用已有的东西。

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

LocalDate级表示没有时间一天和不同时区的日期,唯一的价值。

时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,法国巴黎午夜过后的几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天” 。

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数。

指定适当的时区名称,格式continent/region,如America/MontrealAfrica/CasablancaPacific/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。该命令是Fully-Closed([])(包括开始和结束位置),在这里我们需要Half-Open([))。我们使用了一对条件>=<

您的列名称不正确。避免各种数据库保留的千字中的任何一个。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.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


4

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

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

然后,您可以statement.setXX(param_index, param_value)用来设置相应的值。要转换为timestamp,请查看以下javadocs:

PreparedStatement.setTimeStamp()
时间戳

希望这可以帮助!


4

在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()即可获取当前时间戳记


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.TimestampPreparedStatement.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);

现在,我的条件是从xcart_orders中选择*,其中status ='Q'AND date = CURDATE()。now也仅显示零
Krishna Veni

@krishnaveni您尝试选择哪些记录?
tenorsax 2012年

date(11111111,123456767,122333344)和status =(Q,Q,Q)..全部保存在我的数据库中。现在我希望检查查询并获得计数值并在控制台上显示多少返回计数值后数据匹配
克里希纳·韦尼

@krishnaveni如果您希望结果集受某个日期约束,请在查询中使用该日期,否则删除日期条件。
tenorsax 2012年

当日期以yyyy-mm-dd格式保存在我的数据库中时,在我的代码中成功运行。但是现在我的日期以这种1343469690格式保存在时间戳中。如何获得计数值?我如何在这里写代码
克里希纳·韦尼

3

new Date(timestamp.getTime())应该可以使用,但是新的Java 8方式(可能更优雅,更类型安全,并且有助于您使用新的时间类)是可以调用的Date.from(timestamp.toInstant())

(不要依赖于它Timestamp本身是的实例的事实Date;请参阅其他答案的注释中的说明。)


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

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参数。


2

尝试使用以下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);

0

假设您已经存在java.util.Date date

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

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();
}

-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;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.