web-dev-qa-db-ja.com

Java:文字列をタイムスタンプに変換

文字列をタイムスタンプに変換しようとすると問題が発生します。 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

私が間違っているかもしれないことを知っていますか?助けてくれてありがとう。

50
Dimitra Micha

正しい結果を得るには、次の手順に従います。

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 をスローする可能性があることに注意してください。

87
ZaoTaoBao
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;
    }
  }
}
10
Harsh

現代の答えに貢献したいと思います。この質問が2013年に尋ねられたとき、Timestampクラスを使用することは適切でした。たとえば、データベースに日時を保存する場合です。今日、このクラスは古くなっています。最新のJava日時APIは、3年半前の2014年春にJava 8で登場しました。代わりにこれを使用することをお勧めします。

正確な要件に応じて、Timestampには2つの自然な置き換えがあります。

  • Instantはタイムライン上のポイントです。ほとんどの場合、これを使用するのが最も安全だと思います。 Instantはタイムゾーンに依存せず、通常、クライアントデバイスとデータベースサーバーが異なるタイムゾーンを実行している状況でもうまく機能します。
  • LocalDateTimeは、2011-10-02 18:48:05.123(質問を引用する)のような、タイムゾーンのない日付と時刻です。

最新のJDBCドライバー(JDBC 4.2以降)およびデータベースアクセス用の他の最新ツールは、InstantまたはLocalDateTimeのいずれかをデータ型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();
8
Ole V.V.
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Date date = formatter.parse(dateString);

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

System.out.println(timestamp);
3
Akshay Misal
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
Java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
2
Mahesh Narwade

最初に日付文字列をdateに変換してから、次の一連の行を使用してtimestampに変換します

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

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;
  }
}
1
Yuliia Ashomok

解決策は、oldDateStringが「2009-10-20」のようなものであると確信しています。明らかに、これには日よりも短い時間データは含まれていません。この文字列を新しいフォーマッタでフォーマットする場合、どこから分、秒、ミリ秒を取得する必要がありますか?

したがって、結果は完全に正しい:2009-10-20 00:00:00.000

これを解決するために必要なのは、最初のフォーマット前の元のタイムスタンプ(時間データを含む)です。

0
solver

一度試してみてください...

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

}
0
Suresh U