将 Java 字符串转换为 sql.Timestamp
Posted
技术标签:
【中文标题】将 Java 字符串转换为 sql.Timestamp【英文标题】:Convert Java String to sql.Timestamp 【发布时间】:2011-11-29 11:55:33 【问题描述】:得到一个格式如下的字符串:YYYY-MM-DD-HH.MM.SS.NNNNNN 时间戳来自 DB2 数据库。我需要将其解析为 java.sql.Timestamp 并且不会丢失任何精度。到目前为止,我一直无法找到现有的代码来解析那么远到微秒。 SimpleDateFormat 返回一个 Date 并且只解析到毫秒。简单地看了看 JodaTime,也没有看到这行得通。
【问题讨论】:
如果时间戳来自 DB2 数据库,为什么将其读取为字符串而不是直接读取为时间戳? 时间戳来自数据库,客户端将其返回给我们进行键控读取。 如果您使用时间戳进行键控读取,并且您可能首先将其发送到客户端,您也可以考虑将其转换为长纳秒,然后再读回,而不是一个字符串值。即发送long l = ts.getTime()
,然后用new Timestamp(l)
回读。你甚至可以序列化这个值以节省线路空间(但在这种情况下你会失去人类可编辑性)。
如果我的字符串不是这种格式,而是 mm/dd/yyyy hh:mm 格式怎么办。在这种情况下如何转换为时间戳格式
更新 Java 8 中内置的新 java.time package 可处理纳秒级分辨率。根据您的情况,可能比处理 java.sql.Timestamp 更容易/更好。您也可以转换to 和from java.time & java.sql.Timestamp。
【参考方案1】:
这是将字符串转换为日期的预期方法:
String timestamp = "2011-10-02-18.48.05.123";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd-kk.mm.ss.SSS");
Date parsedDate = df.parse(timestamp);
诚然,它只有毫秒级的分辨率,但在所有比 Twitter 慢的服务中,这就是您所需要的,尤其是因为大多数机器甚至无法追踪到实际的纳秒级。
【讨论】:
这为您提供 java.util.Date 并且请求用于创建 java.sql.Timestamp。它也在 Java 中,问题要求使用 Scala。 您在第一点上是对的,但问题从未提及 Scala 并且被标记为 Java。事实上,据我所知,您的评论是整个页面上唯一提到 Scala 的文字 抱歉,我对另一个明确要求 Scala 的问题感到困惑。当他们允许我时,我会取消我的反对票。【参考方案2】:如果您以字符串形式获取时间,例如 1441963946053,您只需执行以下操作:
//String timestamp;
Long miliseconds = Long.valueOf(timestamp);
Timestamp ti = new Timestamp(miliseconds);
【讨论】:
但是您没有按照他的格式获取日期,请参阅问题。【参考方案3】:您是否尝试过使用Timestamp.valueOf(String)
?看起来它应该几乎完全按照您的意愿行事 - 您只需将日期和时间之间的分隔符更改为空格,将小时和分钟之间的分隔符以及分钟和小时之间的分隔符更改为冒号:
import java.sql.*;
public class Test
public static void main(String[] args)
String text = "2011-10-02 18:48:05.123456";
Timestamp ts = Timestamp.valueOf(text);
System.out.println(ts.getNanos());
假设您已经验证了字符串长度,这将转换为正确的格式:
static String convertSeparators(String input)
char[] chars = input.toCharArray();
chars[10] = ' ';
chars[13] = ':';
chars[16] = ':';
return new String(chars);
或者,通过获取子字符串并使用 Joda Time 或 SimpleDateFormat
(我非常喜欢 Joda Time,但您的里程可能会有所不同)来解析到毫秒。然后将字符串的其余部分作为另一个字符串并用Integer.parseInt
解析它。然后,您可以很容易地组合这些值:
Date date = parseDateFromFirstPart();
int micros = parseJustLastThreeDigits();
Timestamp ts = new Timestamp(date.getTime());
ts.setNanos(ts.getNanos() + micros * 1000);
【讨论】:
Timestamp.valueOf(String) 如何处理时区?【参考方案4】:我相信你需要这样做:
-
使用 SimpleDateFormat 等将 EverythingButNano 转换为 EverythingDate。
使用 Long.valueof(nano) 转换 nano
使用 new Timestamp(everythingDate.getTime()) 将 EverythingDate 转换为时间戳
使用 Timestamp.setNano() 设置 Timestamp nanos
选项 2 转换为 Jon Skeet 的回答中指出的日期格式并使用它。
【讨论】:
【参考方案5】:您可以使用Timestamp.valueOf(String)
。文档声明它理解 yyyy-mm-dd hh:mm:ss[.f...]
格式的时间戳,因此您可能需要更改传入字符串中的字段分隔符。
再一次,如果您要这样做,那么您可以自己解析它并使用setNanos
方法来存储微秒。
【讨论】:
Timestamp.valueOf("2015/06/08".replaceAll("/", "-") + " 00:00:00")以上是关于将 Java 字符串转换为 sql.Timestamp的主要内容,如果未能解决你的问题,请参考以下文章