Подтвердить что ты не робот

Java: преобразовать строку в 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

Знаете ли вы, что я могу делать неправильно? Спасибо за помощь.

4b9b3361

Ответ 1

Выполните следующие шаги для получения правильного результата:

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.

Ответ 2

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

Ответ 3

Я хотел бы внести современный ответ. Когда этот вопрос задавался в 2013 году, использование класса Timestamp было правильным, например, для хранения даты в вашей базе данных. Сегодня класс давно устарел. Современный API дат и времени Java появился с Java 8 в spring 2014 года, три с половиной года назад. Я рекомендую вам использовать это вместо.

В зависимости от вашей ситуации точные требования, есть две естественные замены для Timestamp:

  • Instant - точка на временной линии. Для большинства целей я бы счел самым безопасным использовать это. Instant не зависит от часового пояса и обычно работает хорошо даже в ситуациях, когда ваше клиентское устройство и сервер базы данных работают в разных часовых поясах.
  • LocalDateTime - дата и время суток без часового пояса, например, 2011-10-02 18: 48: 05.123 (чтобы процитировать вопрос).

Современный JDBC-драйвер (JDBC 4.2 или выше) и другие современные инструменты для доступа к базе данных с удовольствием будут хранить либо Instant, либо LocalDateTime в столбце базы данных типа данных Timestamp. Оба класса и другие классы даты и времени, которые я использую в этом ответе, относятся к современному API, известному как java.time или JSR-310.

Легче всего преобразовать вашу строку в 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.

В обоих случаях процедура преобразования из a LocalDateTime в Instant:

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

Я указал преобразование, используя часовой пояс JVM по умолчанию, потому что это то, что использовал бы устаревший класс. Это хрупко, однако, поскольку настройка часового пояса может быть изменена под ногами другими частями вашей программы или другими программами, запущенными в одной JVM. Если можно, укажите часовой пояс в регионе/городском формате, например:

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

Ответ 4

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

Date date = formatter.parse(dateString);

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

System.out.println(timestamp);

Ответ 5

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

Ответ 6

сначала преобразуйте строку даты в date, затем преобразуйте ее в timestamp, используя следующий набор строк

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

Ответ 7

Простой способ конвертировать 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;
  }
}

Ответ 8

Вы можете попробовать один раз...

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

Я уверен, что решение состоит в том, что ваш oldDateString - это что-то вроде "2009-10-20". Очевидно, что это не содержит никаких данных времени, чем дни. Если вы отформатируете эту строку с помощью нового форматирования, откуда он должен получить минуты, секунды и миллисекунды?

Итак, результат абсолютно правильный: 2009-10-20 00: 00: 00.000

Что вам нужно решить, это оригинальная временная метка (включая данные о времени) перед первым форматированием.