2

我需要在 java.sql.Timestamp 上进行操作。

函数的输入是: java.sql.Timestamp 中的格式化日期时间 [可能的日期格式有:MM/dd/yyyy hh:mm:ss aa、MM/dd/yyyy hh:mm:ss、MM/dd/yyyy hh: mm aa、MM/dd/yyyy HH:mm、MM/dd/yy hh:mm aa、MM/dd/yy HH:mm、MM/dd/yyyy 等]

所需输出:另一个时区中的 java.sql.Timestamp 与输入格式相同的 DateTime

所以基本上我需要在 java.sql.Timestamp 中更改 DateTime 的时区

我看过其他帖子,其中提到使用 JODA,但由于某些限制,我无法使用它。

我试过 - 将 java.sql.Timestamp 转换为 java.date.Calendar, - 然后更改时区, - 然后将其转换为日期 - 将日期格式化为相同的格式化日期时间

请看下面的代码:

Timestamp ts = "2012-06-20 18:22:42.0";  // I get this type of value from another function
Calendar cal = Calendar.getInstance();
cal.setTime(ts);
cal.add(Calendar.HOUR, -8);
String string = cal.getTime().toString();     // return value is in " DAY MMM dd hh:mm:ss PDT yyyy " format i.e. Wed Jun 20 10:22:42 PDT 2012
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");  // This could be any format required
Date date;
try {
   date = formatter.parse(string);             // I am getting exception here on parsing 
} catch (ParseException e1) {
   e1.printStackTrace();
}

谁能告诉我这里出了什么问题,或者还有其他方法可以在 Timezone 上操作 java.sql.Timestamp 吗?

谢谢。

4

5 回答 5

5
于 2018-04-06T01:34:45.907 回答
1

我解决了,我把代码供参考。

Timestamp ts = "2012-06-20 18:22:42.0"; // input date in Timestamp format
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Calendar cal = Calendar.getInstance();
cal.setTime(ts)
cal.add(Calendar.HOUR,-7); // Time different between UTC and PDT is -7 hours
String convertedCal = dateFormat.format(cal.getTime());  // This String is converted datetime
 /* Now convert String formatted DateTime to Timestamp*/
SimpleDateFormat formatFrom = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {    
    Date date = formatFrom.parse(convertedCal);
    Timestamp finalTS = new Timestamp(date.getTime()); // Final value in Timestamp: 2012-06-20 11:22:42.0
} catch (Exception e) {
    e.printStackTrace();            
}
于 2012-07-06T04:29:07.053 回答
0

你错过了 formatter.parse 中的一个参数 http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#parse(java.lang.String,%20java.text.ParsePosition )

于 2012-06-25T20:01:35.643 回答
0

你不能简单地:

  1. 以毫秒为单位获取原始时间
  2. 将时区差异转换为毫秒
  3. 添加或减去原始时间的差值。
  4. 使用新时间(以毫秒为单位)创建新时间戳
于 2012-06-25T20:03:09.230 回答
0

将时间戳视为一个固定的时间点,与您碰巧在看时钟的地方断开连接。

如果您想在特定时区的那个时刻显示某人的日历/时钟上的内容,您可以将日历设置为该时区,然后将您的 SimpleDateFormat 关联到该日历。

例如:

public void testFormat() throws Exception {
    Calendar pacific = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));
    Calendar atlantic = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    Timestamp ts = new Timestamp(System.currentTimeMillis());
    sdf.setCalendar(pacific);
    System.out.println(sdf.format(ts));
    sdf.setCalendar(atlantic);
    System.out.println(sdf.format(ts));
}

我的输出是:

2012-06-25 20:27:12.506
2012-06-25 23:27:12.506
于 2012-06-26T03:33:15.070 回答