在Java中将时间戳转换为日期

3

这是我的数据库: 输入图像描述

在这里,我需要检查查询当前日期+状态=Q信息,并获取计数值。

这是我的代码:

public class TodayQ {
    public int data() {
         int count=0;
        Date date = new Date(timestamp);
DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd");
System.out.println( dateFormat.format (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;
    }

}

我需要编辑日期格式为 yyyy-mm-dd,现在已经得到了输出。但是我希望在数据库中使用时间戳。那么如何将时间戳转换为日期格式呢?在Java中如何使用这段代码?


Java中有一个TimeStamp类,可能是sql.timestamp,请查看一下,这可能会对您有所帮助。 - Sikorski
请查看此链接以将时间戳转换为日期。时间戳转日期 - likeToCode
日期列的SQL类型是什么? - user207421
1
那不是一个答案。日期列是什么SQL类型? - user207421
@krishnaveni,你想要什么样的示例? - John Woo
请勿重复发布您的问题!这个问题在几天后被重新发布。我在那里发布了一个使用现代java.time类的详细答案 - Basil Bourque
6个回答

4

您可以使用MySQL函数来实现相同的功能。希望以下查询语句能够给您提供所需的输出。

select * 
from orders
where status='Q' AND 
      date_format(from_unixtime(date),'%Y-%m-%d') = current_date;

你好,如何获取本月的计数值?我必须使用以下查询语句:select * from orders where status='Q' AND DATE_FORMAT(FROM_UNIXTIME(date),'%Y-%m-%d')=MONTH(date) = MONTH(CURDATE()) AND YEAR(date) = YEAR(CURDATE())。但是它没有给出正确的计数值,只显示了0。 - Krishna Veni
这个查询对你有效。选择计数(1)从订单中,其中状态='Q' AND DATE_FORMAT(FROM_UNIXTIME(ts),'%Y-%m')= DATE_FORMAT(now(), '%Y-%m')。 - Deepa

2
Date date = new Date(timestamp);

时间戳是一个长整型变量。


我遇到了一个异常错误:主线程中的异常java.lang.IllegalArgumentException 在java.util.Date.parse(Date.java:598)处 在java.util.Date.<init>(Date.java:255)处 在com.xcart.TodayQ.data(TodayQ.java:16)处 在com.xcart.Demo.main(Demo.java:5) - Krishna Veni
你确定你的变量是“long”类型吗?因为你的堆栈跟踪显示它正在进入解析方法,这可能表明你正在将一个字符串传递到构造函数中。 - tagtraeumer
现在我得到的输出总是显示1970-01-01。我无法理解这个问题,请检查查询并只给我计数。应该怎么做? - Krishna Veni
Alexander Pogrebnyak的回答对我来说看起来最准确。 - Sharique Abdullah

1
假设时间戳是毫秒级别的时间,您可以使用java.util.Calendar将时间戳转换为日期时间,如下所示:
java.util.Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timestamp);
java.util.Date date = cal.getTime();

1

看起来你看到的整数值是UNIX自纪元开始的秒数(即1970-01-01T00:00:00Z)-> http://en.wikipedia.org/wiki/Unix_epoch

我不知道mysql JDBC驱动程序是否会负责为您转换此字段。如果是这样,获取其值的首选方法是:

java.sql.Timestamp ts = result.getTimestamp( columnNumber );

Timestamp扩展了java.util.Date,因此您可以在期望普通java.util.Date的地方使用它。

如果由于某种原因这不能产生所需的结果,则将列值作为long获取并将值调整为毫秒。 在这里您很幸运,因为Java和UNIX的纪元从同一时间开始(Java只是更精确)。

long ts = result.getLong( columnNumber ) * 1000L;

java.util.Date date = new java.util.Date( ts );

这可能是对这个问题最准确的答案。 - Sharique Abdullah

0

打印 yyyy-mm-dd 格式的时间戳:

Date date = new Date(timestamp);
DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd");
System.out.println( dateFormat.format (date));

更新

这里提供一个提示,指引你如何继续进行:

public static int data() {
    int count = 0;
    Date now = Calendar.getInstance().getTime();
    System.out.println("TODAY IS:"+now.getTime()); //TODAY IS:1344007864862

    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");

        PreparedStatement statement1 = (PreparedStatement) con.prepareStatement("SELECT * FROM ORDERS WHERE STATUS = 'Q' AND DT= "+now.getTime());
        ResultSet rs1 = statement1.executeQuery();
        while (rs1 .next()) {
            count++; //A HIT IS FOUND
        }
    } catch (Exception exc) {
        System.out.println(exc.getMessage());
    }
    return count;
}

显然,now.getTime() 返回的是日期被捕获时的实际毫秒数,数学计算取决于您的实现。

请记住,获取午夜(2012年10月5日00:00:00)的日历对象的方法在这里 Java program to get the current date without timestamp


它还遇到了以下异常:Exception in thread "main" java.lang.IllegalArgumentException at java.util.Date.parse(Date.java:598) at java.util.Date.<init>(Date.java:255) at com.xcart.TodayQ.data(TodayQ.java:16) at com.xcart.Demo.main(Demo.java:5) - Krishna Veni
你确定时间戳是有效的吗?发布生成异常的时间戳值。 - MaVRoSCy
现在我得到的输出总是显示为1970-01-01 0...我无法理解这个。检查一下查询并只给我计数。怎么做? - Krishna Veni
Alexander Pogrebnyak的回答对我来说看起来最准确。 - Sharique Abdullah

0

数据库中的日期列应该是 TIMESTAMP 或者 DATE 或者 TIME

这些分别以 java.sql.Timestamp 或者 java.sql.Date 或者 java.sql.Time 的形式检索。

所有这些类都扩展了 java.util.Date

因此,数据应该已经是您要求的格式。

所以没有什么需要做的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接