de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 HydroTekZ
HydroTekZ
Question

Cara mengonversi tanggal ke milidetik

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.

29 2014-10-29T17:39:52+00:00 3
Esmaeil MIRZAEE
Esmaeil MIRZAEE
Pertanyaan edit 28 Desember 2017 в 2:05
Pemrograman
java
date
Pertanyaan ini memiliki :value jawaban dalam bahasa Inggris, untuk membacanya masuk ke akun Anda.
Solution / Answer
Luiggi Mendoza
Luiggi Mendoza
29 Oktober 2014 в 5:42
2014-10-29T17:42:03+00:00
Lebih
Sumber
Sunting
#25945200

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();
Luiggi Mendoza
Luiggi Mendoza
Jawaban edit 17 April 2018 в 8:40
70
0
Basil Bourque
Basil Bourque
29 Oktober 2014 в 8:26
2014-10-29T20:26:08+00:00
Lebih
Sumber
Sunting
#25945203

tl;dr

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

Waspadai kemungkinan kehilangan data. Objek Instant mampu membawa mikrodetik atau nanodetik, lebih halus dari milidetik. Bagian pecahan yang lebih halus dari satu detik akan diabaikan ketika mendapatkan hitungan milidetik.

Tentang java.time

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?

  • Java SE 8, Java SE 9, Java SE 10, dan yang lebih baru
  • Built-in.
  • Bagian dari API Java standar dengan implementasi yang dibundel.
  • Java 9 menambahkan beberapa fitur minor dan perbaikan.
  • Java SE 6 dan Java SE 7
  • Sebagian besar fungsionalitas java.time di back-port ke Java 6 &; 7 di ThreeTreeen-Backport.
  • Android
  • Versi Android yang lebih baru mengimplementasikan bundel implementasi dari kelas java.time.
  • Untuk Android sebelumnya (<26), proyek ThreeTenABP mengadaptasi ThreeTen-Backport (disebutkan di atas). Lihat Cara menggunakan ThreeTenABP.... Proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa depan. Anda mungkin menemukan beberapa kelas yang berguna di sini seperti Interval, YearWeek, YearQuarter, dan more.

    Joda-Time

    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.

    ISO 8601

    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.

    Contoh Kode

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();
Basil Bourque
Basil Bourque
Jawaban edit 17 April 2018 в 6:00
5
0
 allTwentyQuestions
allTwentyQuestions
29 Oktober 2014 в 5:49
2014-10-29T17:49:18+00:00
Lebih
Sumber
Sunting
#25945201

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.

Luiggi Mendoza
Luiggi Mendoza
Jawaban edit 29 Oktober 2014 в 5:49
4
0
Related communities 3
Programmer JAVA indonesia
Programmer JAVA indonesia
1 119 pengguna
Buka telegram
jvmusergroup
jvmusergroup
351 pengguna
Bismillahirrohmanirohim. Perhatian! Grup ini merupakan ekspansi dari grup Forum Java Programmer Indonesia di Facebook. Silahkan berbagi pengalaman dan masalah seputar Java dan keluarganya. https://t.me/JVMIndonesia Admin : @hendisantika34
Buka telegram
Java Indonesia🇲🇨
Java Indonesia🇲🇨
144 pengguna
Programmer Java Indonesia. Grup ini digunakan untuk bertanya terkait materi belajar Java / fullstack Warning=> -dilarang promosi(izin adm -18+🔞 - berbicara sopan - no spam /boot Mohon ikut aturan grup belum di keluarkan
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 1 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi