วิธีรับเวลาและวันที่ปัจจุบันใน Android


1108

ฉันจะรับเวลาและวันที่ปัจจุบันในแอพ Android ได้อย่างไร


3
43 คำตอบ! ในขณะที่หลายของพวกเขาเป็นที่ดีเมื่อพวกเขาถูกเขียนคำตอบที่ดีที่จะใช้ในปี 2018 เป็นที่นี่
Ole VV

คำตอบ:


1310

คุณสามารถใช้:

import java.util.Calendar

Date currentTime = Calendar.getInstance().getTime();

ปฏิทินมีค่าคงที่มากมายสำหรับทุกสิ่งที่คุณต้องการ

แก้ไข:
ตรวจสอบเอกสารประกอบคลาสปฏิทิน


14
+1 สิ่งนี้มีประโยชน์มาก เป็นเรื่องใหม่ทั้งหมดเป็นสิ่งเล็ก ๆ น้อย ๆ ที่เราต้องการ ... ฉันใช้ปฏิทินเพื่อรับวันที่จูเลียน ง่ายกว่าการรับมิลลิวินาทีและหาว่าค่าเท่ากับวันนี้;)
Bill Mote

9
แต่สิ่งนี้ดึงวันที่และเวลามาจากไหน อุปกรณ์ android ตั้งค่าตัวเอง?
Kyle Clegg

12
@Kyle ใช่มันขึ้นอยู่กับการตั้งค่าเวลาของอุปกรณ์ / เขตเวลา อ้างจากเอกสาร : "เมธอด getInstance ของปฏิทินส่งคืนปฏิทินที่มีโลแคลตามการตั้งค่าระบบและฟิลด์เวลาถูกกำหนดค่าเริ่มต้นด้วยวันที่และเวลาปัจจุบัน" - (เหนือบรรทัดโค้ดตัวอย่างแรกในเอกสารชั้นเรียน)

3
+1 โซลูชันนี้มีความแม่นยำเป็นมิลลิวินาทีสิ่งที่ฉันต้องการ
Igor Zelaya

42
@adamdport บอกว่านี่ไม่ได้ตอบคำถาม ... Calendar.getInstance().getTime()หรือCalendar.getInstance().getTimeInMillis()จะใช้งานได้
akousmata

487

คุณสามารถ ( แต่ไม่ควรดูด้านล่าง!) ใช้android.text.format.Time :

Time now = new Time();
now.setToNow();

จากการอ้างอิงเชื่อมโยงด้านบน:

คลาส Time จะเปลี่ยนได้เร็วขึ้นสำหรับคลาส java.util.Calendar และ java.util.GregorianCalendar อินสแตนซ์ของคลาสเวลาแสดงถึงช่วงเวลาที่ระบุด้วยความแม่นยำที่สอง


หมายเหตุ 1: เป็นเวลาหลายปีแล้วที่ฉันเขียนคำตอบนี้และเป็นเรื่องเกี่ยวกับคลาส Android ที่เฉพาะเจาะจงและเลิกเรียนแล้ว Google บอกว่าตอนนี้"[t] ชั้นเรียนของเขามีปัญหาหลายข้อและแนะนำให้ใช้GregorianCalendarแทน"


หมายเหตุ 2:แม้ว่าTimeชั้นเรียนจะมีtoMillis(ignoreDaylightSavings)วิธีการนี้เป็นเพียงความสะดวกในการส่งผ่านไปยังวิธีการที่คาดว่าเวลาเป็นมิลลิวินาที ค่าเวลาเพียงแม่นยำหนึ่งวินาที ; 000ส่วนมิลลิวินาทีอยู่เสมอ ถ้าอยู่ในวงคุณ

Time time = new Time();   time.setToNow();
Log.d("TIME TEST", Long.toString(time.toMillis(false)));
... do something that takes more than one millisecond, but less than one second ...

ลำดับผลลัพธ์จะทำซ้ำค่าเดียวกันเช่น1410543204000จนกระทั่งวินาทีถัดไปได้เริ่มขึ้นซึ่งเวลา1410543205000จะเริ่มทำซ้ำ


2
@InsanityOnABun และ Muhammad Babar ไม่ไม่ไม่. เอกสารบอกว่า"ระบุด้วยความแม่นยำที่สอง"แม้แต่การทดสอบที่ง่ายที่สุด (การรับเวลาปัจจุบันในลูป, toMillis, และการบันทึก / การพิมพ์ผล) จะแสดงให้คุณเห็นว่าเวลาที่ได้คือ 000 เป็นมิลลิวินาที!
ToolmakerSteve

3
@IgorZelaya หากคุณต้องการความแม่นยำเป็นมิลลิวินาทีคุณอาจกำลังทำช่วงเวลาแทนช่วงเวลาของวัน เอกสาร Android แนะนำSystemClock.uptimeMillis()สำหรับช่วงเวลา เนื่องจากเป็นฟังก์ชั่นที่มีในตัวส่วนใหญ่จึงมีแรงจูงใจอย่างมากที่จะใช้งานได้กับทุกอุปกรณ์ ดูการสนทนาในSystemClock ... หากคุณต้องการเชื่อมโยงกับเวลาในแอป RESume ของแอปให้อ่านทั้งสองอย่างนี้และเวลา / setToNow / toMillis จำความแตกต่างระหว่างสิ่งเหล่านั้น
ToolmakerSteve

อย่าใช้เวลาในชั้นเรียน มันจะถูกลบออกในอนาคตและมีปัญหามากมายกับมัน
Sandy Chapman

1
> คลาสนี้เลิกใช้แล้วใน API ระดับ 22 ใช้ GregorianCalendar แทน ดูที่นี่
Neo

ที่จริงแล้วGregorianCalendarถูกแทนที่ปีที่ผ่านมาในชวาและในภายหลัง Android โดยjava.timeZonedDateTimeเรียนโดยเฉพาะ สำหรับก่อนหน้านี้นดรอยด์ให้ดูThreeTen-ย้ายกลับและThreeTenABPโครงการ
Basil Bourque

366

หากคุณต้องการได้รับวันที่และเวลาในรูปแบบเฉพาะคุณสามารถใช้สิ่งต่อไปนี้:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
String currentDateandTime = sdf.format(new Date());

หรือ,

วันที่ :

String currentDate = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(new Date());

เวลา:

String currentTime = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(new Date());

สิ่งนี้จะให้เวลาใน UTC ควรใช้กับเขตเวลา
Andras Balázs Lajtha

10
ระวัง SimpleDateFormat อาจเป็นปัญหาได้หากประสิทธิภาพเป็นปัญหา ในแอปของฉันฉันมีมุมมองที่กำหนดเองที่มีป้ายกำกับประมาณ 20 HH: MM ที่แสดงเวลาที่ระบุ (จำนวนเต็มยาวถือมิลลิวินาที) และทรัพยากรที่สามารถวาดได้จำนวนเท่ากัน การทดสอบเริ่มต้นแสดงให้เห็นว่าการทำงานร่วมกันไม่เป็นของเหลวอย่างที่ฉันต้องการ เมื่อฉันทำโปรไฟล์ onDraw () ฉันพบว่าการโทร SimpleTimeFormatter ใช้เวลา 80% อันที่จริงฉันอ่านหน้านี้เป็นส่วนหนึ่งของการค้นหาฟอร์แมตเตอร์ที่มีประสิทธิภาพมากขึ้นและเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับปฏิทิน ฯลฯ
William T. Mallard

3
ใช่ แต่ไม่นาน ฉันไม่ได้ตระหนักถึงค่าใช้จ่ายที่เกี่ยวข้องและสันนิษฐานว่ามันเป็น POJO
William T. Mallard

32
ในระยะสั้น:String currentDateandTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
Pratik Butani

4
คุณสามารถใส่sdf.setTimeZone(TimeZone.getDefault())ตรงกลาง
ฮาร์วีย์

231

สำหรับผู้ที่อาจชอบรูปแบบที่กำหนดเองคุณสามารถใช้:

DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm");
String date = df.format(Calendar.getInstance().getTime());

โดยที่คุณสามารถมีรูปแบบ DateFormat เช่น:

"yyyy.MM.dd G 'at' HH:mm:ss z" ---- 2001.07.04 AD at 12:08:56 PDT
"hh 'o''clock' a, zzzz" ----------- 12 o'clock PM, Pacific Daylight Time
"EEE, d MMM yyyy HH:mm:ss Z"------- Wed, 4 Jul 2001 12:08:56 -0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"------- 2001-07-04T12:08:56.235-0700
"yyMMddHHmmssZ"-------------------- 010704120856-0700
"K:mm a, z" ----------------------- 0:08 PM, PDT
"h:mm a" -------------------------- 12:08 PM
"EEE, MMM d, ''yy" ---------------- Wed, Jul 4, '01

126

ที่จริงแล้วการตั้งค่าเขตเวลาปัจจุบันที่ปลอดภัยบนอุปกรณ์นั้นปลอดภัยกว่าTime.getCurrentTimezone()หรือคุณจะได้รับเวลาปัจจุบันใน UTC

Time today = new Time(Time.getCurrentTimezone());
today.setToNow();

จากนั้นคุณสามารถรับฟิลด์วันที่ทั้งหมดที่คุณต้องการเช่น:

textViewDay.setText(today.monthDay + "");             // Day of the month (1-31)
textViewMonth.setText(today.month + "");              // Month (0-11)
textViewYear.setText(today.year + "");                // Year 
textViewTime.setText(today.format("%k:%M:%S"));  // Current time

ดูคลาสandroid.text.format.Timeสำหรับรายละเอียดทั้งหมด

UPDATE

ตามที่หลายคนกำลังชี้ให้เห็น Google บอกว่าคลาสนี้มีปัญหามากมายและไม่ควรใช้อีกต่อไป:

คลาสนี้มีปัญหามากมายและขอแนะนำให้ใช้ GregorianCalendar แทน

ปัญหาที่ทราบ:

ด้วยเหตุผลทางประวัติศาสตร์เมื่อทำการคำนวณเวลาการคำนวณทางคณิตศาสตร์ทั้งหมดจะเกิดขึ้นโดยใช้จำนวนเต็ม 32 บิต สิ่งนี้ จำกัด ช่วงเวลาที่เชื่อถือได้ซึ่งแสดงได้ตั้งแต่ปี 1902 ถึง 2037 ดูบทความวิกิพีเดียเกี่ยวกับปัญหาปี 2038 สำหรับรายละเอียด อย่าพึ่งพาพฤติกรรมนี้ มันอาจมีการเปลี่ยนแปลงในอนาคต การเรียก switchTimezone (String) ในวันที่ไม่สามารถอยู่ได้เช่นเวลากำแพงที่ถูกข้ามเนื่องจากการเปลี่ยน DST จะส่งผลให้วันที่ 2512 (เช่น -1 หรือ 1 วินาทีก่อน 1 มกราคม 2513 UTC) การจัดรูปแบบ / การแยกวิเคราะห์ส่วนใหญ่ถือว่าข้อความ ASCII และดังนั้นจึงไม่เหมาะสำหรับใช้กับสคริปต์ที่ไม่ใช่ ASCII


เวลาใดที่ควรนำเข้าจากแพ็คเกจใด
ManishSB

คลาสนี้เลิกใช้แล้วในระดับ API 22 เราสามารถใช้ GregorianCalendar แทน
Choletski

78

สำหรับวันที่และเวลาปัจจุบันให้ใช้:

String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());

ผลลัพธ์ใด:

Feb 27, 2012 5:41:23 PM

ฉันได้รับวันที่ปัจจุบันวันที่และเวลาของระบบ แต่เวลาไม่มีการเปลี่ยนแปลงฉันจะเพิ่มเวลาวินาทีโดย seconds.h ฉันจะทำอย่างไร
Bhavesh Hirpara

2
นี่เป็นวิธีที่แนะนำในการทำตาม Android API: developer.android.com/reference/java/text/…ขอบคุณ!
M Granja

58

ลองด้วยวิธีนี้ทุกรูปแบบได้รับด้านล่างเพื่อรับรูปแบบวันที่และเวลา

    Calendar c = Calendar.getInstance();
    SimpleDateFormat dateformat = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss aa");
    String datetime = dateformat.format(c.getTime());
    System.out.println(datetime);

เป็นครั้งแรก

ที่สอง ที่สาม


53

TL; DR

Instant.now()  // Current moment in UTC.

…หรือ…

ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )  // In a particular time zone

รายละเอียด

คำตอบอื่น ๆ ในขณะที่ถูกต้องจะล้าสมัย คลาสวันเวลาเก่าได้รับการพิสูจน์แล้วว่าได้รับการออกแบบไม่ดีสับสนและมีปัญหา

java.time

คลาสเก่าเหล่านั้นถูกแทนที่ด้วยเฟรมเวิร์กjava.time

คลาสใหม่เหล่านี้ได้รับแรงบันดาลใจจากความสำเร็จอย่างสูงJoda เวลาโครงการที่กำหนดโดยJSR 310และขยายโดยThreeTen-พิเศษโครงการ

ดูออราเคิลกวดวิชา

Instant

Instantเป็นช่วงเวลาบนไทม์ไลน์ในส่วนUTCที่มีความละเอียดถึงนาโนวินาที

 Instant instant = Instant.now(); // Current moment in UTC.

เขตเวลา

สมัครโซนเวลา ( ZoneId) ZonedDateTimeเพื่อให้ได้ หากคุณเว้นเขตเวลาเอาไว้โซนเวลาเริ่มต้นปัจจุบันของ JVM ของคุณจะถูกนำไปใช้โดยปริยาย ดีกว่าที่จะระบุโซนเวลาที่ต้องการ / คาดหวังอย่างชัดเจน

ใช้ชื่อโซนเวลาที่เหมาะสมในรูปแบบของcontinent/regionเช่นAmerica/Montreal, หรือEurope/Brussels Asia/Kolkataห้ามใช้ตัวย่อ 3-4 ตัวอักษรเช่นESTหรือISTตามที่เป็นมาตรฐานหรือไม่ซ้ำกัน

ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or "Asia/Kolkata", "Europe/Paris", and so on.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

ตารางประเภทวันที่ - เวลาใน Java ทั้งทันสมัยและดั้งเดิม

การสร้างสตริง

คุณสามารถสร้างStringเป็นข้อความแสดงค่าวันที่ได้อย่างง่ายดาย คุณสามารถใช้รูปแบบมาตรฐานรูปแบบที่คุณกำหนดเองหรือรูปแบบที่ถูกแปลโดยอัตโนมัติ

ISO 8601

คุณสามารถเรียกtoStringวิธีการที่จะได้รับการจัดรูปแบบข้อความที่ใช้ร่วมกันและเหมาะสมISO 8601มาตรฐาน

String output = instant.toString();

2016-03-23T03: 09: 01.613Z

โปรดทราบว่าสำหรับZonedDateTimeการtoStringวิธีการขยายการรับรองมาตรฐาน ISO 8601 มาตรฐานโดยต่อท้ายชื่อของโซนเวลาในวงเล็บ ข้อมูลที่มีประโยชน์และสำคัญมาก แต่ไม่ได้มาตรฐาน

2016-03-22T20: 09: 01.613-08: 00 [อเมริกา / Los_Angeles]

รูปแบบที่กำหนดเอง

หรือระบุรูปแบบการจัดรูปแบบเฉพาะของคุณเองด้วยDateTimeFormatterคลาส

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy hh:mm a" );

ระบุ a Localeสำหรับภาษามนุษย์ (อังกฤษฝรั่งเศสฯลฯ ) เพื่อใช้ในการแปลชื่อของวัน / เดือนและในการกำหนดบรรทัดฐานทางวัฒนธรรมเช่นคำสั่งของปีและเดือนและวันที่ โปรดทราบว่าLocaleไม่มีส่วนเกี่ยวข้องกับเขตเวลา

formatter = formatter.withLocale( Locale.US ); // Or Locale.CANADA_FRENCH or such.
String output = zdt.format( formatter );

Localizing

ยังดีกว่าปล่อยให้ java.time ทำงานการแปลโดยอัตโนมัติ

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM );
String output = zdt.format( formatter.withLocale( Locale.US ) );  // Or Locale.CANADA_FRENCH and so on.

เกี่ยวกับjava.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, และCalendarSimpleDateFormat

Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310

คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องใช้สตริงไม่จำเป็นต้องมีjava.sql.*คลาส

จะรับคลาส java.time ได้ที่ไหน?

  • Java SE 8 , Java SE 9 , Java SE 10และใหม่กว่า
    • Built-in
    • เป็นส่วนหนึ่งของ Java API มาตรฐานที่มีการใช้งานแบบรวม
    • Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
  • Java SE 6และ Java SE 7
    • มากของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
  • Android
    • การใช้งานชุดบันเดิล Android ในภายหลังของคลาส java.time
    • สำหรับก่อนหน้านี้ Android (<26) ที่ThreeTenABPโครงการปรับThreeTen-ย้ายกลับ (ดังกล่าวข้างต้น) ดูวิธีการใช้ ThreeTenABP … .

ตารางแสดงรายการที่นำเทคโนโลยี * java.time * ไปใช้กับเวอร์ชันใดของ Java และ Android


2
@ giraffe.guru อ่านคำตอบของฉันอีกครั้ง คุณพลาดกระสุนนัดที่สาม ฟังก์ชันการทำงานของ java.time ส่วนใหญ่ถูกแบ็คพอร์ตไปยัง Java 6 & 7 ในThreeTen-Backportและปรับใช้กับ Android ในThreeTenABPเพิ่มเติม
Basil Bourque

Instant.now()และZonedDateTime.now()จำเป็นต้องใช้ API 26
Ryde

2
@Ryde อย่างที่ฉันพูดกับ giraffe.guru อ่านคำตอบของฉันอีกครั้ง มองหาสัญลักษณ์แสดงหัวข้อย่อยที่สามที่กล่าวถึง "Android"
Basil Bourque

ฉันเชื่อว่าคุณพูดถูก: ตาราง java.time รุ่นใหม่ของคุณสื่อข้อความได้โดยตรงและง่ายดายกว่ารายการหัวข้อย่อย ถ้าเป็นฉันฉันคิดว่าฉันจะทำให้เรื่องยุ่งยากเพิ่มขึ้นอีกเล็กน้อยและใส่เครื่องหมายถูกในวงเล็บ (หรือบางอย่างที่คล้ายกัน) ภายใต้ ThreeTenBackport / Java 8+ และภายใต้ ThreeTenABP / Android 26+ เนื่องจากชุดค่าผสมเหล่านี้ทำงานได้เพียงไม่มี มักจะใช้ในจุดใด ๆ แอพ Android ที่ได้รับการพัฒนาที่ใช้ ThreeTenABP และกำหนดเป้าหมายระดับ Android API ทั้งที่สูงกว่าและต่ำกว่าระดับ 26 ดูเหมือนว่าสำหรับฉันนักพัฒนาเลือกได้ดีในกรณีเหล่านี้
Ole VV

1
@ OleV.V ขอบคุณที่แนะนำเครื่องหมายถูกรองในตารางกราฟิก ฉันใช้มันในตารางรุ่นที่ใหม่กว่า ปรับปรุงมาก
Basil Bourque

52

เพื่อ ge เวลาปัจจุบันคุณสามารถใช้System.currentTimeMillis()ซึ่งเป็นมาตรฐานใน Java จากนั้นคุณสามารถใช้มันเพื่อสร้างวันที่

Date currentDate = new Date(System.currentTimeMillis());

และตามที่ผู้อื่นกล่าวถึงเพื่อสร้างเวลา

Time currentTime = new Time();
currentTime.setToNow();

13
ไม่จำเป็นต้องSystem.currentTimeMillis(); ก็จะเป็นสิ่งเดียวกันnew Date()
Jonik

@Jonik Cannot resolve constructor Date()ใน Android, Android SDK ใช้ส่วนผสมของ Java 6 และ 7
surfer190

1
ขอบคุณ. Date currentDate = new Date(System.currentTimeMillis());ถูกต้อง
mghhgm

@mghhgm ไม่มีnew Date(System.currentTimeMillis())ในไม่ถูกต้อง (ก) new Date()มันจะซ้ำซ้อนเป็นที่แน่นอนเช่นเดียวกับ (b) java.util.Dateคลาสที่มีปัญหานั้นถูกแทนที่โดยjava.time.Instantเป็นของ Java 8 และใหม่กว่า Back-รังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับโครงการและก่อนหน้านี้ Android (<26) ในThreeTenABP
Basil Bourque

37

คุณสามารถใช้รหัส:

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate = sdf.format(c.getTime());

เอาท์พุท:

2014-11-11 00:47:55

คุณยังได้รับการจัดรูปแบบตัวเลือกมากขึ้นบางอย่างสำหรับการSimpleDateFormatจากที่นี่


FYI, ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
Basil Bourque

32

ง่ายคุณสามารถแยกเวลาเพื่อรับค่าแยกกันสำหรับเวลาปัจจุบันดังต่อไปนี้:

Calendar cal = Calendar.getInstance(); 

  int millisecond = cal.get(Calendar.MILLISECOND);
  int second = cal.get(Calendar.SECOND);
  int minute = cal.get(Calendar.MINUTE);
        //12 hour format
  int hour = cal.get(Calendar.HOUR);
        //24 hour format
  int hourofday = cal.get(Calendar.HOUR_OF_DAY);

กันไปสำหรับวันดังต่อไปนี้:

Calendar cal = Calendar.getInstance(); 

  int dayofyear = cal.get(Calendar.DAY_OF_YEAR);
  int year = cal.get(Calendar.YEAR);
  int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
  int dayofmonth = cal.get(Calendar.DAY_OF_MONTH);

จะได้รับวันสำหรับ 5-10 วันถัดไป .. มันคือการคำนวณด้วยตนเองที่นี่?
รหัส

@CoDe คุณใช้วันที่สำหรับ
FindOutIslamNow

27

มีหลายตัวเลือกเนื่องจาก Android ส่วนใหญ่เป็น Java แต่ถ้าคุณต้องการเขียนใน textView รหัสต่อไปนี้จะใช้เคล็ดลับ:

String currentDateTimeString = DateFormat.getDateInstance().format(new Date());

// textView is the TextView view that should display it
textView.setText(currentDateTimeString);

8
คุณควรใช้หรือCalendar ชั้นจะเลิก GregorianCalendarDate
โจเซฟเอิร์ล

ขอบคุณเพื่อน :) ฉันไม่รู้เกี่ยวกับเรื่องนั้นเลย
dLobatog

12
ตามเอกสารอ้างอิง Date () ( developer.android.com/reference/java/util/Date.html ) ไม่มีสิ่งใดที่อ้างถึงคลาส Date () ที่ถูกคัดค้าน - อย่างไรก็ตามมีวิธีการและตัวสร้างหลายอย่างที่เลิกใช้แล้ว
Zac Seth

2
สิ่งนี้จะสร้างผลลัพธ์ที่ไม่ถูกต้องในแง่ของการตั้งค่าผู้ใช้ปัจจุบัน (รูปแบบเวลา 12/24 เป็นต้น) ใช้ android.text.format.DateFormat.getTimeFormat (บริบทบริบท) เพื่อรับ DateFormat สำหรับการตั้งค่าผู้ใช้ปัจจุบัน
wonder.mice

@Zac คุณถูกต้องแม้กระทั่งวิธี getTime ของ Date ก็ยิ่งใช้งานได้อย่างเต็มรูปแบบ

24
SimpleDateFormat databaseDateTimeFormate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat databaseDateFormate = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf1 = new SimpleDateFormat("dd.MM.yy");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy.MM.dd G 'at' hh:mm:ss z");
SimpleDateFormat sdf3 = new SimpleDateFormat("EEE, MMM d, ''yy");
SimpleDateFormat sdf4 = new SimpleDateFormat("h:mm a");
SimpleDateFormat sdf5 = new SimpleDateFormat("h:mm");
SimpleDateFormat sdf6 = new SimpleDateFormat("H:mm:ss:SSS");
SimpleDateFormat sdf7 = new SimpleDateFormat("K:mm a,z");
SimpleDateFormat sdf8 = new SimpleDateFormat("yyyy.MMMMM.dd GGG hh:mm aaa");


String currentDateandTime = databaseDateTimeFormate.format(new Date());     //2009-06-30 08:29:36
String currentDateandTime = databaseDateFormate.format(new Date());     //2009-06-30
String currentDateandTime = sdf1.format(new Date());     //30.06.09
String currentDateandTime = sdf2.format(new Date());     //2009.06.30 AD at 08:29:36 PDT
String currentDateandTime = sdf3.format(new Date());     //Tue, Jun 30, '09
String currentDateandTime = sdf4.format(new Date());     //8:29 PM
String currentDateandTime = sdf5.format(new Date());     //8:29
String currentDateandTime = sdf6.format(new Date());     //8:28:36:249
String currentDateandTime = sdf7.format(new Date());     //8:29 AM,PDT
String currentDateandTime = sdf8.format(new Date());     //2009.June.30 AD 08:29 AM

รูปแบบรูปแบบวันที่

G   Era designator (before christ, after christ)
y   Year (e.g. 12 or 2012). Use either yy or yyyy.
M   Month in year. Number of M's determine length of format (e.g. MM, MMM or MMMMM)
d   Day in month. Number of d's determine length of format (e.g. d or dd)
h   Hour of day, 1-12 (AM / PM) (normally hh)
H   Hour of day, 0-23 (normally HH)
m   Minute in hour, 0-59 (normally mm)
s   Second in minute, 0-59 (normally ss)
S   Millisecond in second, 0-999 (normally SSS)
E   Day in week (e.g Monday, Tuesday etc.)
D   Day in year (1-366)
F   Day of week in month (e.g. 1st Thursday of December)
w   Week in year (1-53)
W   Week in month (0-5)
a   AM / PM marker
k   Hour in day (1-24, unlike HH's 0-23)
K   Hour in day, AM / PM (0-11)
z   Time Zone

1
แม้ว่าคำตอบอื่น ๆ จะถูกต้องเกินไป ฉันชอบคำตอบนี้เพราะจะช่วยแก้ไขปัญหาเกี่ยวกับเวลาได้ ขอบคุณ @Vighnesh KM
Ankit Gupta

17
final Calendar c = Calendar.getInstance();
    int mYear = c.get(Calendar.YEAR);
    int mMonth = c.get(Calendar.MONTH);
    int mDay = c.get(Calendar.DAY_OF_MONTH);

textView.setText(""+mDay+"-"+mMonth+"-"+mYear);

15

นี่เป็นวิธีที่จะเป็นประโยชน์ในการรับวันที่และเวลา:

private String getDate(){
    DateFormat dfDate = new SimpleDateFormat("yyyy/MM/dd");
    String date=dfDate.format(Calendar.getInstance().getTime());
    DateFormat dfTime = new SimpleDateFormat("HH:mm");
    String time = dfTime.format(Calendar.getInstance().getTime());
    return date + " " + time;
}

คุณสามารถเรียกวิธีนี้และรับค่าวันที่และเวลาปัจจุบัน:

2017/01//09 19:23

ฉันไม่ชอบการเชื่อมโยงอย่างแน่นหนาของตรรกะการนำเสนอและตรรกะกระบวนการ ฉันต้องการวิธีการที่จะทำการจัดรูปแบบ & ใช้พารามิเตอร์ป้อนวันที่ ฉันยังไม่เข้าใจว่าเพราะเหตุใดคุณจึงใช้ 2 SimpleDateFormats & 2 Dates ... คุณไม่สามารถใช้"yyyy/MM/dd HH:mm"เป็นรูปแบบ & โทรปฏิทินหนึ่งครั้งได้หรือไม่
AjahnCharles

12
Time time = new Time();
time.setToNow();
System.out.println("time: " + time.hour+":"+time.minute);

ตัวอย่างนี้จะให้คุณ 12:32

อย่าลืมนำเข้า android.text.format.Time;


12
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Calendar cal = Calendar.getInstance();
    System.out.println("time => " + dateFormat.format(cal.getTime()));

    String time_str = dateFormat.format(cal.getTime());

    String[] s = time_str.split(" ");

    for (int i = 0; i < s.length; i++) {
         System.out.println("date  => " + s[i]);
    }

    int year_sys = Integer.parseInt(s[0].split("/")[0]);
    int month_sys = Integer.parseInt(s[0].split("/")[1]);
    int day_sys = Integer.parseInt(s[0].split("/")[2]);

    int hour_sys = Integer.parseInt(s[1].split(":")[0]);
    int min_sys = Integer.parseInt(s[1].split(":")[1]);

    System.out.println("year_sys  => " + year_sys);
    System.out.println("month_sys  => " + month_sys);
    System.out.println("day_sys  => " + day_sys);

    System.out.println("hour_sys  => " + hour_sys);
    System.out.println("min_sys  => " + min_sys);

12

สำหรับวันที่และเวลาปัจจุบันที่มีรูปแบบให้ใช้

ในภาษาจาวา

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate = sdf.format(c.getTime());
Log.d("Date","DATE : " + strDate)

ในคอตลิน

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val current = LocalDateTime.now()
    val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy. HH:mm:ss")
    var myDate: String =  current.format(formatter)
    Log.d("Date","DATE : " + myDate)
} else {
    var date = Date()
    val formatter = SimpleDateFormat("MMM dd yyyy HH:mma")
    val myDate: String = formatter.format(date)
    Log.d("Date","DATE : " + myDate)
}

รูปแบบวันที่ Formater

"yyyy.MM.dd G 'at' HH:mm:ss z" ---- 2001.07.04 AD at 12:08:56 PDT
"hh 'o''clock' a, zzzz" ----------- 12 o'clock PM, Pacific Daylight Time
"EEE, d MMM yyyy HH:mm:ss Z"------- Wed, 4 Jul 2001 12:08:56 -0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"------- 2001-07-04T12:08:56.235-0700
"yyMMddHHmmssZ"-------------------- 010704120856-0700
"K:mm a, z" ----------------------- 0:08 PM, PDT
"h:mm a" -------------------------- 12:08 PM
"EEE, MMM d, ''yy" ---------------- Wed, Jul 4, '01

ขอบคุณที่ร่วมต้องการมีส่วนร่วม คุณมีส่วนร่วมในสิ่งที่ไม่ได้อยู่ในคำตอบ 36 ก่อนหน้านี้ ไม่ว่าในกรณีใดคุณยังคงใช้SimpleDateFormatชั้นเรียนที่ล้าสมัยและลำบาก แม้กระทั่งก่อนที่ Oreo คุณไม่จำเป็นต้องทำคุณอาจใช้ThreeTenABP , backport ของ java.time, วันที่และเวลา Java API สมัยใหม่
Ole VV

11

คุณยังสามารถใช้ android.os.SystemClock ตัวอย่างเช่น SystemClock.elapsedRealtime () จะช่วยให้คุณอ่านเวลาได้แม่นยำยิ่งขึ้นเมื่อโทรศัพท์หลับ


10

หากคุณต้องการวันที่ปัจจุบัน:

Calendar cc = Calendar.getInstance();
int year = cc.get(Calendar.YEAR);
int month = cc.get(Calendar.MONTH);
int mDay = cc.get(Calendar.DAY_OF_MONTH);
System.out.println("Date", year + ":" + month + ":" + mDay);

หากคุณต้องการเวลาปัจจุบัน:

 int mHour = cc.get(Calendar.HOUR_OF_DAY);
 int mMinute = cc.get(Calendar.MINUTE);
 System.out.println("time_format" + String.format("%02d:%02d", mHour , mMinute));

9

สำหรับรูปแบบเวลาและวันที่ที่กำหนดเอง:

    SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ",Locale.ENGLISH);
    String cDateTime=dateFormat.format(new Date());

ผลลัพธ์เป็นรูปแบบด้านล่าง: 2015-06-18T10: 15: 56-05: 00




8

คุณสามารถรับวันที่โดยใช้:

Time t = new Time(Time.getCurrentTimezone());
t.setToNow();
String date = t.format("%Y/%m/%d");

สิ่งนี้จะให้ผลลัพธ์ที่ดีแก่คุณดังตัวอย่าง: "2014/02/09"


ตัวสร้างแบบไม่มีพารามิเตอร์Time t = new Time();จะใช้เขตเวลาเริ่มต้น ในประสบการณ์ของฉันเริ่มต้น == ปัจจุบัน
William T. Mallard

7

ฉันมีปัญหากับคำตอบบางส่วนจาก API ดังนั้นฉันจึงรวมรหัสนี้ไว้ฉันหวังว่าจะให้บริการพวกเขา:

    Time t = new Time(Time.getCurrentTimezone());
    t.setToNow();
    String date1 = t.format("%Y/%m/%d");

    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm aa",
            Locale.ENGLISH);
    String var = dateFormat.format(date);
    String horafecha = var+ " - " + date1;

    tvTime.setText(horafecha);

เอาท์พุท: 03:25 PM - 2017/10/03


7

คุณสามารถใช้รหัสต่อไปนี้:

 DateFormat df = new SimpleDateFormat("HH:mm"); // Format time
 String time = df.format(Calendar.getInstance().getTime());

 DateFormat df1 = new SimpleDateFormat("yyyy/MM/dd"); // Format date
 String date = df1.format(Calendar.getInstance().getTime());

6

ลองสิ่งนี้

String mytime = (DateFormat.format("dd-MM-yyyy hh:mm:ss", new java.util.Date()).toString());

นี่คือหนึ่งในสายการบินที่สมบูรณ์แบบและเป็นทางออกที่หรูหรา นั่นคือทั้งหมดที่ต้องการไม่ใช่คำตอบยาว ๆ ที่ไม่จำเป็นเหมือนคำตอบอื่น ๆ
zeeshan

5

วิธีด้านล่างนี้จะส่งกลับวันที่และเวลาปัจจุบันใน String ใช้เขตเวลาที่แตกต่างกันตามเขตเวลาจริงของคุณฉันใช้ GMT

public static String GetToday(){
    Date presentTime_Date = Calendar.getInstance().getTime();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    return dateFormat.format(presentTime_Date);
}

4

คุณควรใช้คลาสปฏิทินตาม API ใหม่ คลาสวันที่เลิกใช้แล้วในขณะนี้

Calendar cal = Calendar.getInstance();

String date = ""+cal.get(Calendar.DATE)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.YEAR);

String time = ""+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE);

4

ลองใช้รหัสด้านล่าง:

 Date date = new Date();
 SimpleDateFormat dateFormatWithZone = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",Locale.getDefault());  
 String currentDate = dateFormatWithZone.format(date);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.