Saya ingin mengkonversi String myDate = "2014/10/29 18:10:45"
ke
`long ms (yaitu saat ini)? Saya mencarinya di Google, tetapi saya hanya bisa menemukan cara mengkonversi ms ke tanggal.
Catatan: Untuk memperjelas, saya ingin mendapatkan ms dari tanggal dalam format 1970/1/1.
Anda tidak memiliki Tanggal
, Anda memiliki representasi String
dari sebuah tanggal. Anda harus mengkonversi String
menjadi Date
dan kemudian mendapatkan milidetik. Untuk mengkonversi String
menjadi Tanggal
dan sebaliknya, Anda harus menggunakan kelas SimpleDateFormat
.
Berikut ini adalah contoh dari apa yang anda ingin/perlu lakukan (dengan asumsi zona waktu tidak terlibat di sini):
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();
Namun, tetap berhati-hati karena di Java milidetik yang diperoleh adalah milidetik antara epoch yang diinginkan dan 1970-01-01 00:00:00.
Menggunakan Date/Time API baru yang tersedia sejak Java 8:
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
Zona Waktu
Jawaban yang diterima adalah benar, kecuali bahwa ia mengabaikan masalah krusial zona waktu. Apakah string input Anda 6:10 PM di Paris atau Montréal? Atau UTC? Gunakan nama zona waktu yang tepat. Biasanya benua ditambah kota/wilayah. Misalnya,
"Europe/Oslo"
. Hindari kode 3 atau 4 huruf yang tidak terstandarisasi atau unik.java.time
Pendekatan modern menggunakan kelas java.time. Ubah input Anda agar sesuai dengan standar ISO 8601. Ganti spasi di tengah dengan
T
. Dan ganti karakter garis miring dengan tanda hubung. Kelas java.time menggunakan format-format standar ini secara default ketika mem-parsing/menghasilkan string. Jadi tidak perlu menentukan pola pemformatan.
String input = "2014/10/29 18:10:45".replace( " " , "T" ).replace( "/" , "-" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;
Sebuah LocalDateTime
, seperti string input Anda, tidak memiliki konsep zona waktu atau offset-from-UTC. Tanpa konteks zona/offset, LocalDateTime
tidak memiliki arti yang nyata. Apakah pukul 6:10 PM di India, Eropa, atau Kanada? Masing-masing tempat tersebut mengalami pukul 6:10 PM pada saat yang berbeda, pada titik yang berbeda pada timeline. Jadi, Anda harus menentukan yang mana yang ada dalam pikiran Anda jika Anda ingin menentukan titik tertentu pada garis waktu.
ZoneId z = ZoneId.of( "Europe/Oslo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
Sekarang kita memiliki momen tertentu, dalam ZonedDateTime
. Konversikan ke UTC dengan mengekstrak Instant
. Kelas Instant
merepresentasikan momen pada garis waktu dalam UTC dengan resolusi nanodetik (hingga sembilan (9) digit pecahan desimal).
Instant instant = zdt.toInstant() ;
Sekarang kita bisa mendapatkan hitungan milidetik yang Anda inginkan sejak referensi epoch momen pertama tahun 1970 di UTC, 1970-01-01T00:00Z.
long millisSinceEpoch = instant.toEpochMilli() ;
Instant
mampu membawa mikrodetik atau nanodetik, lebih halus dari milidetik. Bagian pecahan yang lebih halus dari satu detik akan diabaikan ketika mendapatkan hitungan milidetik.Kerangka kerja java.time dibangun di Java 8 dan yang lebih baru. Kelas-kelas ini menggantikan kelas-kelas legacy date-time lama yang merepotkan seperti java.util.Date
, Calendar
, &; SimpleDateFormat
.
Proyek Joda-Time, sekarang dalam maintenance mode, menyarankan migrasi ke kelas java.time.
Untuk mempelajari lebih lanjut, lihat Oracle Tutorial. Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310.
Anda dapat menukar objek java.time secara langsung dengan basis data Anda. Gunakan JDBC driver yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu kelas java.sql.*
.
Di mana mendapatkan kelas java.time?
Interval
, YearWeek
, YearQuarter
, dan more.Update: Proyek Joda-Time sekarang dalam maintenance mode, dengan tim menyarankan migrasi ke kelas java.time. Saya akan membiarkan bagian ini tetap utuh untuk sejarah. Di bawah ini adalah jenis kode yang sama tetapi menggunakan pustaka Joda-Time 2.5 dan menangani zona waktu. Kelas java.util.Date, .Calendar, dan .SimpleDateFormat terkenal merepotkan, membingungkan, dan cacat. Hindari mereka. Gunakan Joda-Time atau paket java.time (terinspirasi oleh Joda-Time) yang dibangun di Java 8.
String Anda hampir dalam format ISO 8601. Garis miring harus berupa tanda hubung dan SPACE di tengah harus diganti dengan T
. Jika kita mengubahnya, maka string yang dihasilkan bisa langsung dimasukkan ke dalam konstruktor tanpa perlu repot-repot menentukan formatter. Joda-Time menggunakan format ISO 8701 sebagai default untuk mengurai dan menghasilkan string.
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();
Kelas SimpleDateFormat memungkinkan Anda untuk mengurai sebuah String
menjadi sebuah objek java.util.Date
. Setelah Anda memiliki objek Date, Anda bisa mendapatkan milidetik sejak epoch dengan memanggil Date.getTime()
.
Contoh lengkapnya:
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();
Perhatikan bahwa ini memberikan Anda sebuah long
dan bukan double, tetapi saya pikir mungkin itulah yang Anda maksudkan. Dokumentasi untuk kelas SimpleDateFormat
memiliki banyak sekali informasi tentang bagaimana mengaturnya untuk mengurai format yang berbeda.