使用java.sql.TimeStamp和mysql数据库遇到奇怪的行为

时间:2012-03-27 15:11:04

标签: mysql sql jdbc

奇怪的行为是我使用System.currentTimeMillis()方法创建的java.sql.Timestamp作为1970-01-01 01:00:00存储在我的MySQL数据库中。

我创建的两个时间戳是标记我正在尝试执行的监视任务的开始和结束,以下是行为发生的代码的例外情况

final long startTime = System.currentTimeMillis();
while(numberOfTimeStepsPassed < numTimeStep) {
/*
* Code in here 
*/
}
final long endTime = System.currentTimeMillis();
return mysqlConnection.insertDataInformation(matrixOfRawData, name,Long.toString(startTime), 
                                                 Long.toString(endTime), Integer.toString(numTimeStep),
                                                 Integer.toString(matrixOfRawData[0].length), owner,
                                                 type);

以下是用于将时间戳和其他数据插入MySQL数据库的代码

public String insertDataInformation(final  double [][] matrix,
                                    final String ... params) {
    getConnection(lookUpName);
    String id = "";
    PreparedStatement dataInformationInsert = null;
    try {
        dataInformationInsert =
                databaseConnection.prepareStatement(DATA_INFORMATION_PREPARED_STATEMENT);
        id = DatabaseUtils.createUniqueId();
        int stepsMonitored = Integer.parseInt(params[STEPS_MONITORED]);
        int numberOfMarkets = Integer.parseInt(params[NUMBER_OF_MARKETS]);
        dataInformationInsert.setNString(ID_INDEX, id);
        dataInformationInsert.setNString(NAME_INDEX, params[0]);
        dataInformationInsert.setTimestamp(START_INDEX, new Timestamp(Long.parseLong(params[START_INDEX])));
        dataInformationInsert.setTimestamp(END_INDEX, new Timestamp(Long.parseLong(params[END_INDEX])));
        dataInformationInsert.setInt(STEPS_INDEX, stepsMonitored);
        dataInformationInsert.setInt(MARKETS_INDEX, numberOfMarkets);
        dataInformationInsert.setNString(OWNER_INDEX, params[OWNER]);
        dataInformationInsert.setNString(TYPE_INDEX, params[TYPE]);
        dataInformationInsert.executeUpdate();
        insertRawMatrix(matrix, id, Integer.toString(stepsMonitored), Integer.toString(numberOfMarkets));
    } catch (SQLException sqple) {
        // TODO Auto-generated catch block
        sqple.printStackTrace();
        System.out.println(sqple.getSQLState());
    } finally {
        close(dataInformationInsert);
        dataInformationInsert = null;
        close(databaseConnection);
    }
    return id;
}

重要的代码行是:

dataInformationInsert.setTimestamp(START_INDEX, new Timestamp(Long.parseLong(params[START_INDEX])));
dataInformationInsert.setTimestamp(END_INDEX, new Timestamp(Long.parseLong(params[END_INDEX])));

TimeStamp上的JavaDocs(http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/Timestamp.html)表示它自1970年1月1日起以毫秒为单位,并且简单的打印测试证实了这一点。

我在寻找的是:

  • 尝试通过java.sql.Timestamp在MySQL数据库中存储时间戳时出现此问题的原因?
  • 这种行为的任何解决方案?
  • 任何可能的替代方案?
  • 任何可能的改进?

编辑: 被要求包括START_INDEX和END_INDEX:

 private static final int END_INDEX = 4;
 private static final int START_INDEX = 3;

为不将它们放入原始帖子而道歉。

1 个答案:

答案 0 :(得分:1)

好的,看看你的电话:

insertDataInformation(matrixOfRawData, name, Long.toString(startTime), 
                      Long.toString(endTime), Integer.toString(numTimeStep),
                      Integer.toString(matrixOfRawData[0].length), owner,
                      type);

所以params会有值:

0: name
1: start time
2: end time
3: numTimeStep
4: matrixOfRowData[0].length
5: owner
6: type

然后你正在做:

dataInformationInsert.setTimestamp(START_INDEX,
    new Timestamp(Long.parseLong(params[START_INDEX])));

...其中START_INDEX为3。

因此,您使用与numTimeStep对应的值作为时间戳的值...我怀疑您不想这样做。

强烈建议你创建一个简单的对象类型(可能是同一个类中的嵌套类型),让你在强类型中传递这些参数,简单得到正确的< / em>时尚。字符串转换和索引访问都是没有根据的,很容易引起错误。