文字列をタイムスタンプに変換しようとすると問題が発生します。 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
私が間違っているかもしれないことを知っていますか?助けてくれてありがとう。
正しい結果を得るには、次の手順に従います。
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
をスローする可能性があることに注意してください。
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;
}
}
}
現代の答えに貢献したいと思います。この質問が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();
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date date = formatter.parse(dateString);
Timestamp timestamp = new Timestamp(date.getTime());
System.out.println(timestamp);
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
Java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
最初に日付文字列をdate
に変換してから、次の一連の行を使用してtimestamp
に変換します
Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());//instead of date put your converted date
Timestamp myTimeStamp= timestamp;
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;
}
}
解決策は、oldDateStringが「2009-10-20」のようなものであると確信しています。明らかに、これには日よりも短い時間データは含まれていません。この文字列を新しいフォーマッタでフォーマットする場合、どこから分、秒、ミリ秒を取得する必要がありますか?
したがって、結果は完全に正しい:2009-10-20 00:00:00.000
これを解決するために必要なのは、最初のフォーマット前の元のタイムスタンプ(時間データを含む)です。
一度試してみてください...
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);
}
}