文字列myDate = "2014/10/29 18:10:45"を、
long ms (i.e. currentinmlilies) に変換したいのですが。 long ms (e.g. currentinmlilies)
に変換したいのですが?Googleで探してみても、msをdateに変換する方法しか見つかりません。
注:明確にするために、私は1970/1/1形式の日付からmsを取得したいのです。
Dateではなく、日付を表す
Stringがあります。文字列 "を "日付 "に変換してから、ミリ秒を取得する必要があります。文字列
をDate
に、またはその逆に変換するには、SimpleDateFormat
クラスを使用します。
以下に、やりたいこと、必要なことの例を示します(ここではタイムゾーンは関係ないと仮定しています)。
String myDate = "2014/10/29 18:10:45";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = sdf.parse(myDate);
long millis = date.getTime();
ただし、Javaでは、取得されるミリ秒は、目的のエポックと1970-01-01 00:00:00の間のミリ秒になるので注意が必要です。
Java 8から利用可能になった新しいDate/Time APIを使用する。
String myDate = "2014/10/29 18:10:45";
LocalDateTime localDateTime = LocalDateTime.parse(myDate,
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss") );
/*
With this new Date/Time API, when using a date, you need to
specify the Zone where the date/time will be used. For your case,
seems that you want/need to use the default zone of your system.
Check which zone you need to use for specific behaviour e.g.
CET or America/Lima
*/
long millis = localDateTime
.atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli();
LocalDateTime.parse( // Parse into an object representing a date with a time-of-day but without time zone and without offset-from-UTC.
"2014/10/29 18:10:45" // Convert input string to comply with standard ISO 8601 format.
.replace( " " , "T" ) // Replace SPACE in the middle with a `T`.
.replace( "/" , "-" ) // Replace SLASH in the middle with a `-`.
)
.atZone( // Apply a time zone to provide the context needed to determine an actual moment.
ZoneId.of( "Europe/Oslo" ) // Specify the time zone you are certain was intended for that input.
) // Returns a `ZonedDateTime` object.
.toInstant() // Adjust into UTC.
.toEpochMilli() // Get the number of milliseconds since first moment of 1970 in UTC, 1970-01-01T00:00Z.
1414602645000
受け入れられた答えは正しいのですが、タイムゾーンという重要な問題を無視しています。入力された文字列が午後6時10分なのは、パリなのかモントリオールなのか?それともUTCですか?
適切なタイムゾーン名]2を使用してください。通常は、大陸と都市・地域の組み合わせです。例えば、"Europe/Oslo"
のようになります。標準化されておらず、ユニークでもない3文字または4文字のコードは避けてください。
現代的なアプローチでは、java.timeクラスを使用します。
ISO 8601]3規格に準拠するように入力を変更してください。真ん中のSPACEをT
に置き換えてください。また、スラッシュ文字をハイフンに置き換えます。java.time*クラスは、文字列を解析/生成する際に、これらの標準フォーマットをデフォルトで使用します。そのため、フォーマットパターンを指定する必要はありません。
String input = "2014/10/29 18:10:45".replace( " " , "T" ).replace( "/" , "-" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;
入力文字列のようなLocalDateTime
はタイムゾーンやUTCからのオフセットの概念がありません。ゾーンやオフセットの文脈がなければ、LocalDateTime
は本当の意味を持ちません。インドでは午後6時10分なのか、ヨーロッパではなのか、カナダではなのか。それらの場所のそれぞれが、タイムライン上の異なるポイントで、異なる瞬間に午後6時10分を経験します。ですから、タイムライン上の特定のポイントを決定したい場合には、どちらを念頭に置いているかを指定する必要があります。
ZoneId z = ZoneId.of( "Europe/Oslo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
これで、ZonedDateTime
の特定の瞬間がわかりました。インスタントを抽出してUTCに変換します。Instant
](http://docs.oracle.com/javase/10/docs/api/java/time/Instant.html) クラスは UTC のタイムライン上の瞬間を nanoseconds の分解能で表します (10進数の9桁まで)。
Instant instant = zdt.toInstant() ;
これで、1970年の最初の瞬間のエポックリファレンス(UTC、1970-01-01T00:00Z)からの希望のミリ秒数を得ることができます。
long millisSinceEpoch = instant.toEpochMilli() ;
Java 8以降ではjava.timeというフレームワークが組み込まれています。これらのクラスは、java.util.Date
, Calendar
, & SimpleDateFormat
などの厄介な古いlegacyの日付-時刻クラスに取って代わるものです。
現在メンテナンスモードのJoda-Timeプロジェクトでは、java.timeクラスへの移行を推奨しています。
詳しくは、Oracle Tutorialをご覧ください。また、Stack Overflowを検索すると、多くの例や説明があります。仕様はJSR 310です。
データベースと直接 java.time オブジェクトを交換することができます。JDBC 4.2](http://openjdk.java.net/jeps/170)以降に準拠した[JDBCドライバ](https://en.wikipedia.org/wiki/JDBC_driver)を使用してください。文字列や java.sql.*
クラスは必要ありません。
java.timeクラスはどこで入手できますか?
Interval
、YearWeek
、YearQuarter
、moreなどの便利なクラスが見つかるかもしれません。Update: Joda-Timeプロジェクトは現在メンテナンスモードで、チームはjava.timeクラスへの移行を勧めています。このセクションは歴史のためにそのままにしておきます。 以下は同じようなコードですが、Joda-Time 2.5ライブラリを使用し、タイムゾーンを処理しています。 java.util.Date、.Calendar、.SimpleDateFormatクラスは有名なトラブル、混乱、欠陥のあるクラスです。これらのクラスは使用しないでください。Joda-TimeまたはJava 8に組み込まれたjava.timeパッケージ(Joda-Timeにインスパイアされたもの)を使用してください。
あなたの文字列は、ほぼISO 8601形式です。スラッシュをハイフンにして、真ん中のSPACEをT
に置き換える必要があります。これを調整すれば、フォーマッタを指定しなくても、出来上がった文字列を直接コンストラクタに入力することができます。Joda-Timeは文字列の解析と生成にISO 8701フォーマットをデフォルトで使用しています。
String inputRaw = "2014/10/29 18:10:45";
String input = inputRaw.replace( "/", "-" ).replace( " ", "T" );
DateTimeZone zone = DateTimeZone.forID( "Europe/Oslo" ); // Or DateTimeZone.UTC
DateTime dateTime = new DateTime( input, zone );
long millisecondsSinceUnixEpoch = dateTime.getMillis();
SimpleDateFormat](http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html)クラスを使うと、`String`をパースして`java.util.Date`オブジェクトを作成することができます。Dateオブジェクトを取得したら、`Date.getTime()`を呼び出してエポックからのミリ秒を得ることができます。
完全な例です。
String myDate = "2014/10/29 18:10:45";
//creates a formatter that parses the date in the given format
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = sdf.parse(myDate);
long timeInMillis = date.getTime();
これではdoubleではなくlong
になってしまいますが、おそらく意図したものになっていると思います。SimpleDateFormat`クラスのドキュメントには、異なるフォーマットを解析するための設定方法が大量に記載されています。