将Java字符串转换为sql.Timestamp

将Java字符串转换为sql.Timestamp,java,string,parsing,timestamp,Java,String,Parsing,Timestamp,得到一个格式为YYYY-MM-DD-HH.MM.SS.NNNNNN的字符串时间戳来自DB2数据库。我需要将其解析为java.sql.Timestamp,并且不丢失任何精度。到目前为止,我还无法找到现有的代码来解析到微秒。SimpleDataFormat返回一个日期,只解析为毫秒。简单地看了一下JodaTime,也不认为这会起作用 你试过使用吗?它看起来应该完全符合您的要求-您只需将日期和时间之间的分隔符更改为空格,将小时和分钟之间的分隔符更改为冒号: import java.sql.*; pu

得到一个格式为YYYY-MM-DD-HH.MM.SS.NNNNNN的字符串时间戳来自DB2数据库。我需要将其解析为java.sql.Timestamp,并且不丢失任何精度。到目前为止,我还无法找到现有的代码来解析到微秒。SimpleDataFormat返回一个日期,只解析为毫秒。简单地看了一下JodaTime,也不认为这会起作用

你试过使用吗?它看起来应该完全符合您的要求-您只需将日期和时间之间的分隔符更改为空格,将小时和分钟之间的分隔符更改为冒号:

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)
。文档说明它理解格式为
yyyy-mm-dd hh:mm:ss[.f..]
的时间戳,因此您可能需要更改传入字符串中的字段分隔符


同样,如果要这样做,您可以自己解析它,然后使用
setNanos
方法存储微秒。

我相信您需要这样做:

  • 使用SimpleDateFormat等将everythingButNano转换为everythingDate
  • 使用Long.valueof(nano)转换nano
  • 将everythingDate转换为具有新时间戳的时间戳(everythingDate.getTime())
  • 使用Timestamp.setNano()设置时间戳nano
  • 选择2
    转换为Jon Skeet答案中指出的日期格式并使用该格式。

    以下是将字符串转换为日期的预期方法:

    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慢的服务中,这就是你所需要的,特别是因为大多数机器甚至无法追踪到实际的纳秒。

    如果你以字符串的形式获取时间,比如1441963946053,你只需做以下事情:

    //String timestamp;
    Long miliseconds = Long.valueOf(timestamp);
    Timestamp ti = new Timestamp(miliseconds);
    

    如果时间戳来自DB2数据库,为什么要将其作为字符串读取而不是直接作为时间戳读取?时间戳来自数据库,客户机将其返回给我们进行键控读取。如果您使用时间戳进行键控读取,并且您可能首先将其发送给客户机,您可以选择考虑将其转换为长纳秒,然后将其读回,而不是字符串值。i、 e.发出
    long l=ts.getTime()
    ,然后用
    新的时间戳(l)
    读回。您甚至可以序列化此值以节省导线上的空间(但在本例中,您将失去可编辑性)。如果我的字符串不是此格式,而是mm/dd/yyyy hh:mm格式,该怎么办。本例中介绍了如何转换为时间戳格式更新新的内置Java 8处理纳秒分辨率。可能比处理java.sql.Timestamp更容易/更好,具体取决于您的场景。您也可以转换和java.time&java.sql.Timestamp。Timestamp.valueOf(String)如何处理时区?但是您没有得到该格式中的日期,请参见问题。这将为您提供java.util.date,请求用于创建java.sql.Timestamp。同样在Java中,这个问题要求使用Scala。你在第一点上是对的,但是这个问题从来没有提到Scala,并且被标记为Java。事实上,据我所知,你的评论是整个页面上唯一提到ScalaSorry的文本,我被另一个明确要求Scala的问题弄糊涂了。当他们允许我使用.Timestamp.valueOf(“2015/06/08.replaceAll”(“/”,“-”)+“00:00:00”)时,我将删除我的否决票