如何时间戳转换为日期在Java中?(How to convert TimeStamp to Date

2019-06-17 15:57发布

如何转换“时间戳”,以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?

Answer 1:

只是做一个新的Date ,贴邮票的对象getTime()值作为参数。

这里有一个例子(我用的当前时间的一个例子时间戳):

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


Answer 2:

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


Answer 3:

只是:

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


Answer 4:

因为很长一段时间我一直在找这个,原来, 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));


Answer 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类表示没有时间一天和不同时区的日期,唯一的价值。

时区是在确定的日期是至关重要的。 对于任何给定的时刻,日期由区全球各地的变化。 例如,在午夜后几分钟法国巴黎是新的一天,同时还“昨天”在蒙特利尔魁北克 。

如果没有指定时区,JVM的隐式应用当前默认时区。 该默认可以在任何时刻都在变化,因此您的结果可能会有所不同。 最好明确指定所需/预期的时区作为参数。

指定适当的时区名称 ,格式为continent/region ,如America/MontrealAfrica/Casablanca ,或Pacific/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.

或指定的日期。 您可以通过多种设置月,与健全的编号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.DateCalendar ,和SimpleDateFormat

乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。

要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • 的Java SE 8Java 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试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多 。



Answer 6:

首先,你不利用利用的优势PreparedStatement 。 我首先建议你修改你PreparedStatement如下:

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

然后,您可以使用statement.setXX(param_index, param_value)设定相应的值。 对于转换为timestamp ,看看下面的javadoc:

了PreparedStatement.setTimestamp()
时间戳

希望这可以帮助!



Answer 7:

不知道你想在查询中选择,但要记住的是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);


Answer 8:

new Date(timestamp.getTime())应该工作,但新奇特的Java 8路(这可能是更优雅,更类型安全,以及帮助指引你使用新的时间类)是调用Date.from(timestamp.toInstant())

(不要依赖于一个事实,即Timestamp本身就是一个实例Date ;看到的评论解释另一个答案 。)



Answer 9:

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


Answer 10:

在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的()来得到当前的时间戳



Answer 11:

我觉得有必要作出回应,因为其他的答案似乎是时区无关,其实际的应用程序无法承受如此。 为了使时间戳最新的正确转换时的时间戳和JVM使用不同的时区,你可以使用约达时间的LocalDateTime(或LocalDateTime在Java8)是这样的:

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

下面的示例假定时间戳为UTC(如通常使用数据库的情况下)。 如果您的时间戳在不同的时区,改变的时区参数toDate声明。



Answer 12:

尝试使用这个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);


Answer 13:

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

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


Answer 14:

您可以使用此方法来从时间戳和特定地区的时区的获取日期。

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


Answer 15:

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;


Answer 16:

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


文章来源: How to convert TimeStamp to Date in Java?