รับการประทับเวลาปัจจุบันหรือไม่


248

ฉันต้องการได้รับการประทับเวลาปัจจุบันเช่นนั้น: 1320917972

int time = (int) (System.currentTimeMillis());
Timestamp tsTemp = new Timestamp(time);
String ts =  tsTemp.toString();

2
FYI, ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.CalendarและTimestampตอนนี้มรดกแทนที่ด้วยjava.timeชั้นเรียน ส่วนใหญ่ของjava.timeการทำงานจะกลับรังเพลิง Java 6 & Java 7 ในThreeTen-ย้ายกลับโครงการ ดัดแปลงเพิ่มเติมสำหรับ Android รุ่นก่อนหน้าในโครงการThreeTenABP ดูวิธีการใช้ ThreeTenABP … .
Basil Bourque

คำตอบ:


299

ทางออกคือ:

Long tsLong = System.currentTimeMillis()/1000;
String ts = tsLong.toString();

นี่ไม่ได้คำนึงถึงการชดเชยเวลาของอุปกรณ์
kjdion84

1
@ kjdion84 ขอโทษฉัน แต่ทำไมคุณคิดว่ามันจะสำคัญ เพียงแค่ตามคำถาม
Cԃաԃ

82

จากบล็อกของนักพัฒนาซอฟต์แวร์:

System.currentTimeMillis()คือนาฬิกา "ผนัง" มาตรฐาน (เวลาและวันที่) แสดงมิลลิวินาทีนับตั้งแต่ยุค ผู้ใช้หรือเครือข่ายโทรศัพท์สามารถตั้งค่านาฬิกาแขวนได้ (ดูที่setCurrentTimeMillis (ยาว) ) ดังนั้นเวลาอาจกระโดดไปข้างหน้าหรือข้างหลังอย่างไม่คาดคิด นาฬิกานี้ควรใช้เมื่อการติดต่อกับวันที่และเวลาในโลกแห่งความจริงมีความสำคัญเช่นในแอปพลิเคชันปฏิทินหรือนาฬิกาปลุก การวัดช่วงเวลาหรือเวลาที่ผ่านไปควรใช้นาฬิกาอื่น หากคุณกำลังใช้System.currentTimeMillis()พิจารณาการฟังACTION_TIME_TICK, ACTION_TIME_CHANGEDและACTION_TIMEZONE_CHANGEDออกอากาศเจตนาที่จะหาเมื่อมีการเปลี่ยนแปลงเวลา


11
จากdeveloper.android.com/reference/java/lang/… ฉันพบว่าSystem.nanoTime()เป็นทางเลือกSystem.currentTimeMillis()และไม่มีความผันผวนที่ไม่แน่นอนและออกแบบมาสำหรับการวัดความแตกต่างของระยะเวลา
Bianca Daniciuc

2
@ ana01 "โดยทั่วไปค่าศูนย์จะเป็นทุกครั้งที่อุปกรณ์ทำการบู๊ตครั้งล่าสุด" - ดังนั้นจึงสามารถใช้งานได้เฉพาะเมื่อคุณเปรียบเทียบความแตกต่างของระยะเวลาบนอุปกรณ์เดียวกัน ไม่มีประโยชน์สำหรับการจัดเก็บฐานข้อมูลตัวอย่างเช่น
Michał K

1
เพียงหมายเหตุถึงความคิดเห็นของ @ ana01 ที่System.nanoTime()ไม่เหมาะสำหรับแสดงเวลานาฬิกาแขวน เพื่อจุดประสงค์นั้นให้ใช้System.currentTimeMillis()แทน
Akash Agarwal

33

1320917972เป็น Unix timestamp โดยใช้จำนวนวินาทีตั้งแต่ 00:00:00 UTC วันที่ 1 มกราคม 1970 คุณสามารถใช้TimeUnitคลาสสำหรับการแปลงหน่วย - จากSystem.currentTimeMillis()เป็นวินาที

String timeStamp = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));

29

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

SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
String format = s.format(new Date());

22
นี่ไม่ใช่การประทับเวลา (นับตั้งแต่กาลเวลา)
Michał K

1
ไม่ใช่การประทับเวลาและยิ่งกว่านั้นไม่มีประสิทธิภาพเลย (การสร้าง SimpleDateFormat การสร้างวันที่การแปลง) หลีกเลี่ยงมัน.
Seynorth

คุณกำลังตอบคำถามอื่น แต่ก็ใช้ได้เช่นกัน
ทำท่า

24

ใช้วิธีการด้านล่างเพื่อรับการประทับเวลาปัจจุบัน มันใช้งานได้ดีสำหรับฉัน

/**
 * 
 * @return yyyy-MM-dd HH:mm:ss formate date as string
 */
public static String getCurrentTimeStamp(){
    try {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentDateTime = dateFormat.format(new Date()); // Find todays date

        return currentDateTime;
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }
}

37
นั่นไม่ใช่การประทับเวลา

1
@Hits มันเป็นรูปแบบวันที่ที่เรียบง่ายไม่ใช่การประทับเวลา คุณเพียงแค่ใช้ชื่อตัวแปรเป็น currentTimeStap
ersks

12

มันใช้ง่าย:

long millis = new Date().getTime();

หากคุณต้องการในรูปแบบเฉพาะคุณต้องฟอร์แมตเตอร์ด้านล่าง

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String millisInString  = dateFormat.format(new Date());

8

นี่คือการประทับเวลาที่มนุษย์สามารถอ่านได้ซึ่งอาจใช้ในชื่อไฟล์ในกรณีที่บางคนต้องการสิ่งเดียวกันกับที่ฉันต้องการ:

package com.example.xyz;

import android.text.format.Time;

/**
 * Clock utility.
 */
public class Clock {

    /**
     * Get current time in human-readable form.
     * @return current time as a string.
     */
    public static String getNow() {
        Time now = new Time();
        now.setToNow();
        String sTime = now.format("%Y_%m_%d %T");
        return sTime;
    }
    /**
     * Get current time in human-readable form without spaces and special characters.
     * The returned value may be used to compose a file name.
     * @return current time as a string.
     */
    public static String getTimeStamp() {
        Time now = new Time();
        now.setToNow();
        String sTime = now.format("%Y_%m_%d_%H_%M_%S");
        return sTime;
    }

}

1
เฮ้คุณสามารถบอกวิธีที่ดีที่สุดในการเรียงลำดับรายการบันทึกเวลาได้หรือไม่ ฉันคิดว่าจะเรียงลำดับตัวเอง แต่คิดว่าอาจมีวิธีที่ดีกว่า
Abbas

สำหรับการอ้างอิงในอนาคตสำหรับใครก็ตามที่อ่านสิ่งนี้โปรดทราบว่า "android.text.format.Time" ถูกเลิกใช้แล้ว
jason.kaisersmith

5

ลองสิ่งเหล่านี้

time.setText(String.valueOf(System.currentTimeMillis()));

และ timeStamp เป็นรูปแบบเวลา

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String dateString = formatter.format(new Date(Long.parseLong(time.getText().toString())));
time.setText(dateString);

4

java.time

ฉันควรจะมีส่วนร่วมในคำตอบที่ทันสมัย

    String ts = String.valueOf(Instant.now().getEpochSecond());
    System.out.println(ts);

เอาต์พุตเมื่อทำงานในตอนนี้:

1543320466

ในขณะที่การหารด้วย 1,000 จะไม่แปลกใจสำหรับหลาย ๆ คนการแปลงเวลาของคุณเองอาจทำให้อ่านยากได้ค่อนข้างเร็วดังนั้นจึงเป็นนิสัยที่ไม่ดีเมื่อคุณสามารถหลีกเลี่ยงได้

Instantชั้นเรียนที่ผมใช้เป็นส่วนหนึ่งของ java.time วันที่ Java ที่ทันสมัยและเวลา API มันมีอยู่แล้วในเวอร์ชัน Android ใหม่ระดับ API 26 ขึ้นไป หากคุณกำลังเขียนโปรแกรมสำหรับ Android รุ่นเก่าคุณอาจได้รับ backport ดูด้านล่าง หากคุณไม่ต้องการทำอย่างนั้นฉันก็ยังคงใช้การแปลงในตัว:

    String ts = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
    System.out.println(ts);

นี่เป็นเช่นเดียวกับคำตอบของแมวน้ำ เอาท์พุทเหมือนเดิม

คำถาม: ฉันสามารถใช้ java.time บน Android ได้หรือไม่

ใช่ java.time ทำงานได้ดีบนอุปกรณ์ Android รุ่นเก่าและใหม่กว่า มันก็ต้องมีอย่างน้อยJava 6

  • ใน Java 8 และใหม่กว่าและบนอุปกรณ์ Android รุ่นใหม่ (จาก API ระดับ 26) API ที่ทันสมัยนั้นมีมาให้ในตัว
  • ในที่ไม่ใช่ Android Java 6 และ 7 จะได้รับ ThreeTen Backport ซึ่งเป็น backport ของคลาสใหม่ (ThreeTen สำหรับ JSR 310 ดูลิงค์ที่ด้านล่าง)
  • บน (เก่า) Android ใช้ Android รุ่น ThreeTen Backport มันเรียกว่า ThreeTenABP และตรวจสอบให้แน่ใจว่าคุณได้อิมพอร์ตคลาสวันที่และเวลาจากorg.threeten.bpด้วยแพ็กเกจย่อย

การเชื่อมโยง


1
เกือบคำตอบที่สมบูรณ์แบบ (ฉัน upvoted) แต่อย่างน้อยในความเห็นของฉันคุณควรลบการอ้างอิง ThreeTen Backport เนื่องจากนี่เป็นคำถามเกี่ยวกับ Android และไม่ใช่ Java โดยทั่วไป และอาจทำให้สับสนสำหรับผู้เริ่มต้นที่ Android
Slobodan Antonijević

1
@ SlobodanAntonijevićมันเป็นสิ่งสำคัญสำหรับโปรแกรมเมอร์ Android ที่จะเข้าใจว่า (a) ถ้าพวกเขาสนับสนุน Android 26 และใหม่กว่าพวกเขามีการใช้งานของjava.timeในตัว (b) ถ้าสนับสนุน Android ต้นก่อน 26 พวกเขาจะต้องเพิ่มห้องสมุด ที่ThreeTenABPห้องสมุดและ (ค) ถ้าใช้ThreeTenABPรู้ว่าห้องสมุดนี้เป็นจริงการปรับตัวของThreeTen-ย้ายกลับดัดแปลงมาจาก Java เพื่อ Android ThreeTenABPห้องสมุดเป็นเพียงเสื้อคลุม Android เฉพาะรอบThreeTen-ย้ายกลับห้องสมุด ดูกราฟตารางนี้เปรียบเทียบ 3 ไลบรารี
Basil Bourque

@BasilBourque คุณถูกต้องครบถ้วน แต่ในความเป็นจริงคุณสามารถนำเข้า ThreeTen-Backport และใช้ในแอพ Android แต่มีผลกระทบอย่างมากต่อประสิทธิภาพการทำงานของการพึ่งพา JAR นี่คือเหตุผลที่ฉันได้กล่าวว่าโพสต์ควรมีความเฉพาะเจาะจงมากขึ้นว่า Android devs ไม่ควรใช้ ThreeTen-Backport และใช้ ThreeTenABP สำหรับ API 25 และต่ำกว่า ฉันเห็น devs จำนวนมากบนกระดานต่าง ๆ ที่สับสนว่าควรใช้อันใดกับ Android เพราะทำให้ชื่อคล้ายกัน
Slobodan Antonijević

จุดดี @ SlobodanAntonijević ฉันพยายามทำให้ชัดเจนขึ้นเล็กน้อย
Ole VV

1
@ SlobodanAntonijević ตารางนี้แสดงตำแหน่งที่จะรับjava.timeสำหรับทั้ง Java และ Android อาจช่วยให้ชัดเจน
Basil Bourque

3

ทางออกใน Kotlin:

val nowInEpoch = Instant.now().epochSecond

ตรวจสอบว่าเวอร์ชั่น SDK ต่ำสุดของคุณคือ 26


0

ฉันแนะนำให้ใช้คำตอบของ Hits แต่เพิ่มรูปแบบ Locale นี่คือวิธีที่นักพัฒนา Android แนะนำ :

try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        return dateFormat.format(new Date()); // Find todays date
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }

0

รหัสนี้เป็นรุ่น Kotlin ฉันมีความคิดอื่นที่จะเพิ่มจำนวนสุ่มแบบสุ่มในหลักสุดท้ายสำหรับการให้เวลาความแปรปรวน

รุ่น Kotlin

val randomVariance = (0..100).shuffled().first()
val currentEpoch = (System.currentTimeMilis()/1000) + randomVariance

val deltaEpoch = oldEpoch - currentEpoch

ฉันคิดว่ามันจะดีกว่าถ้าใช้ kode นี้จากนั้นขึ้นอยู่กับ Android เวอร์ชัน 26 ขึ้นไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.