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

时间:2012-08-07 04:25:01

标签: java date jdbc timestamp

在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-07 0,但等效查询返回3.为什么我得到0?

16 个答案:

答案 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)

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类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

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

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 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.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);

答案 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();