日期-Java:将字符串转换为时间戳

我在尝试将字符串转换为时间戳时遇到问题。 我有一个日期格式为yyyy-MM-dd的数组,并且我想更改为yyyy-MM-dd HH:mm:ss.SSS657的格式。因此,我使用以下代码:

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

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

Dimitra Micha asked 2019-11-08T15:52:30Z
9个解决方案
96 votes

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

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 
}

请注意,ParseException可能会抛出ParseException

ZaoTaoBao answered 2019-11-08T15:52:57Z
14 votes
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 strDate) {
    try {
      DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
       // you can change format of date
      Date date = formatter.parse(strDate);
      Timestamp timeStampDate = new Timestamp(date.getTime());

      return timeStampDate;
    } catch (ParseException e) {
      System.out.println("Exception :" + e);
      return null;
    }
  }
}
Harsh answered 2019-11-08T15:53:18Z
9 votes

我想贡献现代的答案。 当在2013年提出此问题时,使用LocalDateTime类是正确的,例如用于将日期时间存储到数据库中。 今天,这堂课早已过时了。 现代Java日期和时间API于三年半前的2014年春季随Java 8一起发布。 我建议您改用它。

根据您的情况的确切要求,可以自然替换LocalDateTime

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

现代的JDBC驱动程序(JDBC 4.2或更高版本)和其他用于数据库访问的现代工具将很乐意将LocalDateTimeInstant存储到数据类型为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

还是更好,将LocalDateTime的输出存储到数据类型Instant的数据库列中。

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

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

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

    Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();
Ole V.V. answered 2019-11-08T15:55:16Z
3 votes
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Date date = formatter.parse(dateString);

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

System.out.println(timestamp);
Akshay Misal answered 2019-11-08T15:55:36Z
2 votes
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
Mahesh Narwade answered 2019-11-08T15:55:55Z
2 votes

将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;
  }
}
Yuliia Ashomok answered 2019-11-08T15:56:27Z
1 votes

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

Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());//instead of date put your converted date
Timestamp myTimeStamp= timestamp;
KhAn SaAb answered 2019-11-08T15:57:01Z
0 votes

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

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

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

solver answered 2019-11-08T15:57:45Z
0 votes

你能尝试一次吗...

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);
    }

}
Suresh U answered 2019-11-08T15:58:15Z
translate from https://stackoverflow.com:/questions/18915075/java-convert-string-to-timestamp