Java:将String转换为TimeStamp

时间:2013-09-20 10:57:38

标签: java date datetime timestamp

我尝试将String转换为TimeStamp时遇到问题。我有一个日期格式为yyyy-MM-dd的数组,我希望以yyyy-MM-dd HH:mm:ss.SSS的格式进行更改。所以,我使用这段代码:

final String OLD_FORMAT = "yyyy-MM-dd";
final String NEW_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
String oldDateString = createdArray[k];
String newDateString;

DateFormat formatter = new SimpleDateFormat(OLD_FORMAT);
Date d = formatter.parse(oldDateString);
((SimpleDateFormat) formatter).applyPattern(NEW_FORMAT);
newDateString = formatter.format(d);
System.out.println(newDateString);

Timestamp ts = Timestamp.valueOf(newDateString);
System.out.println(ts);

我得到以下结果。

  

2009-10-20 00:00:00.000

     

2009-10-20 00:00:00.0

但是当我尝试简单地做

String text = "2011-10-02 18:48:05.123";
ts = Timestamp.valueOf(text);
System.out.println(ts);

我得到了正确的结果:

  

2011-10-02 18:48:05.123

你知道我可能做错了什么吗? 谢谢你的帮助。

11 个答案:

答案 0 :(得分:88)

请按照以下步骤获得正确的结果:

try {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
    Date parsedDate = dateFormat.parse(yourString);
    Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());
} catch(Exception e) { //this generic but you can control another types of exception
    // look the origin of excption 
}

请注意,.parse(String)可能会引发ParseException

答案 1 :(得分:10)

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Util{
  public static Timestamp convertStringToTimestamp(String str_date) {
    try {
      DateFormat formatter;
      formatter = new SimpleDateFormat("dd/MM/yyyy");
       // you can change format of date
      Date date = formatter.parse(str_date);
      java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());

      return timeStampDate;
    } catch (ParseException e) {
      System.out.println("Exception :" + e);
      return null;
    }
  }
}

答案 2 :(得分:8)

我想提供现代答案。在2013年提出此问题时,使用Timestamp类是正确的,例如将日期时间存储到数据库中。今天班级已经过时了。在三年半前的2014年春天,Java 8发布了现代Java日期和时间API。我建议你改用它。

根据您的情况确切要求,Timestamp有两种自然替代品:

  • Instant是时间线上的一个点。在大多数情况下,我认为使用它最安全。 Instant与时区无关,即使客户端设备和数据库服务器运行不同的时区,通常也能正常运行。
  • LocalDateTime是没有时区的日期和时间,例如2011-10-02 18:48:05.123(引用问题)。

现代JDBC驱动程序(JDBC 4.2或更高版本)和其他用于数据库访问的现代工具将很乐意将InstantLocalDateTime存储到数据类型timestamp的数据库列中。我在本答案中使用的类和其他日期时间类都属于称为java.time或JSR-310的现代API。

将字符串转换为LocalDateTime是最简单的,所以我们先来看看:

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
    String text = "2011-10-02 18:48:05.123";
    LocalDateTime dateTime = LocalDateTime.parse(text, formatter);
    System.out.println(dateTime);

打印

2011-10-02T18:48:05.123

如果您的字符串采用yyyy-MM-dd格式,请执行:

    String text = "2009-10-20";
    LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay();
    System.out.println(dateTime);

打印

2009-10-20T00:00

或者更好的是,从LocalDate.parse()获取输出并将其存储到数据类型为date的数据库列中。

在这两种情况下,从LocalDateTime转换为Instant的程序为:

    Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant();
    System.out.println(ts);

我已经使用JVM的默认时区指定了转换,因为这是过时的类将使用的。但这很脆弱,因为时区设置可能会被程序的其他部分或同一JVM中运行的其他程序改变。如果可以,请改为指定 region / city 格式的时区,例如:

    Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();

答案 3 :(得分:3)

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Date date = formatter.parse(dateString);

Timestamp timestamp = new Timestamp(date.getTime());

System.out.println(timestamp);

答案 4 :(得分:2)

DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());

答案 5 :(得分:1)

首先将您的日期字符串转换为date,然后使用以下一行将其转换为timestamp

Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());//instead of date put your converted date
Timestamp myTimeStamp= timestamp;

答案 6 :(得分:1)

将String转换为java.sql.Timestamp的简单方法:

Timestamp t = new Timestamp(DateUtil.provideDateFormat().parse("2019-01-14T12:00:00.000Z").getTime());

DateUtil.java:

import java.text.SimpleDateFormat;
import java.util.TimeZone;

public interface DateUtil {

  String ISO_DATE_FORMAT_ZERO_OFFSET = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
  String UTC_TIMEZONE_NAME = "UTC";

  static SimpleDateFormat provideDateFormat() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ISO_DATE_FORMAT_ZERO_OFFSET);
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone(UTC_TIMEZONE_NAME));
    return simpleDateFormat;
  }
}

答案 7 :(得分:1)

仅出于完整性考虑,这是一个使用lambda和方法参考的解决方案:

ISO格式?

说明: 以下方法

  • 如果给出了有效的输入,则将String与模式yyyy-MM-dd转换为Timestamp
  • 如果给出了null值,则返回null
  • 如果输入的内容无效,则
  • 抛出DateTimeParseException

代码

static Timestamp convertStringToTimestamp(String strDate) {
    return Optional.ofNullable(strDate) // wrap the String into an Optional
                   .map(str -> LocalDate.parse(str).atStartOfDay()) // convert into a LocalDate and fix the hour:minute:sec to 00:00:00
                   .map(Timestamp::valueOf) // convert to Timestamp
                   .orElse(null); // if no value is present, return null
}


验证: 可以使用以下单元测试来测试此方法: (带有 Junit5 Hamcrest

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
    // given
    String strDate = "2020-01-30";

    // when
    final Timestamp result = convertStringToTimestamp(strDate);

    // then
    final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
    assertThat(dateTime.getYear(), is(2020));
    assertThat(dateTime.getMonthValue(), is(1));
    assertThat(dateTime.getDayOfMonth(), is(30));
}

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenInvalidInput() {
    // given
    String strDate = "7770-91-30";

    // when, then
    assertThrows(DateTimeParseException.class, () -> convertStringToTimestamp(strDate));
}

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenNullInput() {
    // when
    final Timestamp result = convertStringToTimestamp(null);

    // then
    assertThat(result, is(nullValue()));
}


另一种格式?

通常,要解析的字符串带有另一种格式。处理它的一种方法是使用格式化程序将其转换为另一种格式。这是一个示例:

输入:20200130 11:30

模式:yyyyMMdd HH:mm

输出:此输入的时间戳

代码

static Timestamp convertStringToTimestamp(String strDate) {
    final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm");
    return Optional.ofNullable(strDate) //
                   .map(str -> LocalDateTime.parse(str, formatter))
                   .map(Timestamp::valueOf) //
                   .orElse(null);
}

测试

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
    // given
    String strDate = "20200130 11:30";

    // when
    final Timestamp result = convertStringToTimestamp(strDate);

    // then
    final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
    assertThat(dateTime.getYear(), is(2020));
    assertThat(dateTime.getMonthValue(), is(1));
    assertThat(dateTime.getDayOfMonth(), is(30));
    assertThat(dateTime.getHour(), is(11));
    assertThat(dateTime.getMinute(), is(30));
}

答案 8 :(得分:0)

你可以尝试一次......

String dob="your date String";
String dobis=null;
final DateFormat df = new SimpleDateFormat("yyyy-MMM-dd");
final Calendar c = Calendar.getInstance();
try {
    if(dob!=null && !dob.isEmpty() && dob != "")
    {
    c.setTime(df.parse(dob));
    int month=c.get(Calendar.MONTH);
    month=month+1;
    dobis=c.get(Calendar.YEAR)+"-"+month+"-"+c.get(Calendar.DAY_OF_MONTH);
    }

}

答案 9 :(得分:0)

我确信解决方案是你的oldDateString就像“2009-10-20”。显然,这不包含低于天数的任何时间数据。如果使用新的格式化程序格式化此字符串,应该从哪里获取分钟,秒和毫秒?

所以结果绝对正确:2009-10-20 00:00:00.000

您需要解决此问题的原因是第一次格式化之前的原始时间戳(包括时间数据)。

答案 10 :(得分:0)

这就是我所做的:

Timestamp timestamp = Timestamp.valueOf(stringValue);

其中 stringValue 可以是任何格式的日期/时间。