Saya memiliki milidetik di file log tertentu yang dihasilkan di server, saya juga tahu lokal dari mana file log dihasilkan, masalah saya adalah mengkonversi milidetik ke tanggal dalam format yang ditentukan. Pemrosesan log itu terjadi di server yang terletak di zona waktu berbeda. Saat mengonversi ke program "SimpleDateFormat" berarti mengambil tanggal mesin karena tanggal yang diformat seperti itu tidak mewakili waktu server yang benar. Apakah ada cara untuk menangani ini dengan elegan?
long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);
System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));
DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");
System.out.println("jodaTime "+parser1.print(jodaTime));
Keluaran:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
GregorianCalendar
,,SimpleDateFormat
dll.) Dan perpustakaan Joda-Time yang sangat baik sekarang digantikan oleh kelas java.time modern .Jawaban:
sumber
final Calendar calendar = Calendar.getInstance();
1515436200000l
, saya mendapatkancalendar.get(Calendar.MONTH))
sebagai0
!java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .Anda dapat menggunakan
java.util.Date
kelas dan kemudian gunakanSimpleDateFormat
untuk memformatDate
.Kita bisa menggunakan paket java.time (tutorial) - API DateTime diperkenalkan di Java SE 8.
// Format the date
sumber
java.util.Date
disusutkan. (Ada API Tanggal & Waktu yang diperbaiki di JDK8java.time
)java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .tl; dr
Detail
Jawaban lain menggunakan kelas yang ketinggalan zaman atau salah.
Hindari kelas tanggal-waktu lama seperti java.util.Date/.Calendar. Mereka terbukti dirancang dengan buruk, membingungkan, dan merepotkan.
waktu java
The java.time kerangka datang dibangun ke Jawa 8 dan kemudian. Banyak fungsi yang di- backport ke Java 6 & 7 dan selanjutnya diadaptasi ke Android . Dibuat oleh beberapa orang yang sama seperti yang dibuat Joda-Time .
An
Instant
adalah momen di timeline dalam UTC dengan resolusi nanodetik . Its zaman adalah saat pertama tahun 1970 di UTC.Dengan asumsi data input Anda adalah hitungan milidetik dari 1970-01-01T00: 00: 00Z (tidak jelas dalam Pertanyaan), maka kita dapat dengan mudah membuat contoh
Instant
.The
Z
dalam standar ISO 8601 string yang diformat adalah singkatanZulu
dan sarana UTC .Terapkan zona waktu menggunakan nama zona waktu yang tepat , untuk mendapatkan a
ZonedDateTime
.Lihat kode ini berjalan langsung di IdeOne.com .
Asia/Kolkata
zona waktu ?Saya menduga Anda memiliki zona waktu India yang memengaruhi kode Anda. Kami melihat di sini bahwa penyesuaian ke
Asia/Kolkata
zona waktu membuat waktu yang sama dengan yang Anda laporkan,08:55
yaitu lima setengah jam lebih awal dari nilai UTC kami03:25
.Zona default
Anda dapat menerapkan zona waktu default JVM saat ini. Hati-hati karena default dapat berubah kapan saja selama runtime . Kode apa pun di utas aplikasi mana pun dalam JVM dapat mengubah default saat ini. Jika penting, minta pengguna untuk zona waktu yang diinginkan / diharapkan.
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti
java.util.Date
,Calendar
, &SimpleDateFormat
.Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Dengan driver JDBC yang mematuhi JDBC 4.2 atau yang lebih baru, Anda dapat bertukar objek java.time secara langsung dengan database Anda. Tidak perlu untuk string atau kelas java.sql. *.
Di mana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti
Interval
,YearWeek
,YearQuarter
, dan lebih .sumber
ZoneId.systemDefault()
. Lihat bagian baru yang ditambahkan di akhir Jawaban saya.Cara termudah untuk melakukan ini adalah dengan menggunakan kelas Joda DateTime dan tentukan cap waktu dalam milidetik dan DateTimeZone yang Anda inginkan.
Saya sangat menyarankan menghindari kelas Tanggal dan Kalender Java bawaan; mereka mengerikan.
sumber
Jika nilai millis adalah jumlah millis sejak 1 Januari 1970 GMT, seperti standar untuk JVM, maka itu tidak tergantung pada zona waktu. Jika Anda ingin memformatnya dengan zona waktu tertentu, Anda cukup mengonversinya menjadi objek GregorianCalendar dan mengatur zona waktu. Setelah itu ada banyak cara untuk memformatnya.
sumber
Solusi saya
sumber
Saya melakukannya seperti ini:
Anda juga dapat menggunakan
getDateInstance(int style)
dengan parameter berikut:DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
sumber
Kelas SimpleDateFormat memiliki metode yang disebut SetTimeZone (TimeZone) yang diwarisi dari kelas DateFormat. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
sumber
Cara termudah:
sumber
Di bawah ini adalah solusi saya untuk mendapatkan tanggal dari milidetik ke format tanggal. Anda harus menggunakan Perpustakaan Joda untuk menjalankan kode ini.
sumber
Anda dapat mencoba java.time api;
sumber