Android có dấu thời gian hiện tại?


247

Tôi muốn lấy dấu thời gian hiện tại như thế: 1320917972

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

2
FYI, người già lớp ngày thời gian phiền hà như java.util.Date, java.util.CalendarTimestampbây giờ là di sản, thay thế bởi sự java.time lớp. Hầu hết các chức năng java.time được chuyển ngược lại sang Java 6 & Java 7 trong dự án ThreeTen-Backport . Thích nghi hơn nữa cho Android trước đó trong dự án ThreeTenABP . Xem Cách sử dụng ThreeTenABP .
Basil Bourque

Câu trả lời:


298

Giải pháp là :

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

Đây không phải là yếu tố trong bù thời gian của thiết bị.
kjdion84

1
@ kjdion84 xin lỗi, nhưng tại sao bạn nghĩ nó sẽ quan trọng? Chỉ dựa trên câu hỏi.
Cԃ ա

82

Từ blog của nhà phát triển:

System.currentTimeMillis()là đồng hồ "tường" tiêu chuẩn (thời gian và ngày) biểu thị mili giây kể từ thời đại. Đồng hồ treo tường có thể được đặt bởi người dùng hoặc mạng điện thoại (xem setCienTimeMillis (dài) ), do đó thời gian có thể nhảy lùi hoặc chuyển tiếp một cách khó lường. Đồng hồ này chỉ nên được sử dụng khi sự tương ứng với ngày và giờ trong thế giới thực là quan trọng, chẳng hạn như trong ứng dụng lịch hoặc đồng hồ báo thức. Các phép đo thời gian trôi qua hoặc thời gian trôi qua nên sử dụng một đồng hồ khác. Nếu bạn đang sử dụng System.currentTimeMillis(), hãy cân nhắc lắng nghe ACTION_TIME_TICK, ACTION_TIME_CHANGEDACTION_TIMEZONE_CHANGEDchương trình phát sóng ý định tìm hiểu khi thời gian thay đổi.


11
Từ developer.android.com/reference/java/lang/ Vì tôi thấy đó System.nanoTime()là một giải pháp thay thế System.currentTimeMillis()và nó không có biến động khó lường và được thiết kế để đo sự khác biệt về thời lượng.
Bianca Daniciuc

2
@ ana01 "giá trị 0 thường là bất cứ khi nào thiết bị khởi động lần cuối" - vì vậy nó chỉ có thể được sử dụng khi bạn so sánh sự khác biệt về thời lượng trên cùng một thiết bị. Không hữu ích cho việc lưu trữ cơ sở dữ liệu chẳng hạn.
Michał K

1
Chỉ cần một lưu ý cho nhận xét của @ ana01 System.nanoTime()không phù hợp để hiển thị thời gian trên đồng hồ treo tường. Đối với mục đích đó, sử dụng System.currentTimeMillis()thay thế.
Akash Agarwal

33

1320917972 là dấu thời gian Unix sử dụng số giây kể từ 00:00:00 UTC ngày 1 tháng 1 năm 1970. Bạn có thể sử dụng TimeUnitlớp để chuyển đổi đơn vị - từ System.currentTimeMillis()sang giây.

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

29

Bạn có thể sử dụng lớp SimpleDateFormat :

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

22
Đây không phải là dấu thời gian (thời gian kể từ thời đại)
Michał K

1
Không phải là dấu thời gian, và hơn nữa, không hiệu quả chút nào (tạo SimpleDateFormat, tạo ngày, chuyển đổi). Tránh nó
Seynorth

Bạn đang trả lời sth khác, nhưng nó cũng hợp lệ.
vào

24

Sử dụng phương pháp dưới đây để có được dấu thời gian hiện tại. Việc này ổn với tôi.

/**
 * 
 * @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
Đó không phải là dấu thời gian.

1
@Hits, Đó là định dạng ngày đơn giản, không phải là dấu thời gian. Bạn chỉ đang sử dụng tên biến là currentTimeStap.
vào

12

Đó là cách sử dụng đơn giản:

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

nếu bạn muốn nó ở định dạng cụ thể thì bạn cần Formatter như bên dưới

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

8

Đây là dấu thời gian có thể đọc được của con người có thể được sử dụng trong tên tệp, chỉ trong trường hợp ai đó cần điều tương tự mà tôi cần:

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
Này, bạn cũng có thể nói cách tốt nhất để sắp xếp danh sách dấu thời gian không? Tôi đã nghĩ đến việc tự sắp xếp chúng nhưng nghĩ rằng có thể có một cách tốt hơn.
Abbas

Để tham khảo trong tương lai cho bất kỳ ai đọc điều này, hãy lưu ý rằng "android.text.format.Time" hiện không được chấp nhận
jason.kaisersmith

5

Thử những thứ này xem

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

và timeStamp để định dạng thời gian

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

4

java.time

Tôi muốn đóng góp câu trả lời hiện đại.

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

Đầu ra khi chạy ngay bây giờ:

1543320466

Mặc dù việc chia cho 1000 sẽ không gây ngạc nhiên cho nhiều người, nhưng việc chuyển đổi thời gian của riêng bạn có thể khó đọc khá nhanh, do đó, đó là một thói quen xấu khi bạn có thể tránh được.

Các Instantlớp mà tôi đang sử dụng là một phần của java.time, ngày Java hiện đại và thời gian API. Nó được tích hợp sẵn trên các phiên bản Android mới, API cấp 26 trở lên. Nếu bạn đang lập trình cho Android cũ hơn, bạn có thể nhận được backport, xem bên dưới. Nếu bạn không muốn làm điều đó, có thể hiểu được, tôi vẫn sử dụng chuyển đổi tích hợp:

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

Điều này giống như câu trả lời của sealskej. Đầu ra giống như trước đây.

Câu hỏi: Tôi có thể sử dụng java.time trên Android không?

Có, java.time hoạt động độc đáo trên các thiết bị Android cũ hơn và mới hơn. Nó chỉ cần ít nhất Java 6 .

  • Trong Java 8 trở lên và trên các thiết bị Android mới hơn (từ API cấp 26), API hiện đại được tích hợp sẵn.
  • Trong Java 6 và 7 không phải Android có được ThreeTen Backport, backport của các lớp mới (ThreeTen cho JSR 310; xem các liên kết ở phía dưới).
  • Trên (cũ) Android sử dụng phiên bản Android của ThreeTen Backport. Nó được gọi là ThreeTenABP. Và hãy chắc chắn rằng bạn nhập các lớp ngày và thời gian từ org.threeten.bpvới các gói con.

Liên kết


Câu trả lời gần như hoàn hảo (tôi nêu lên) nhưng, ít nhất theo quan điểm trung thực của tôi, bạn nên xóa tham chiếu ThreeTen Backport vì đây là câu hỏi về Android chứ không phải Java nói chung. Và nó có thể gây nhầm lẫn cho người mới bắt đầu tại Android.
Slobodan Antonijević

1
@ SlobodanAntonijević Điều quan trọng đối với các lập trình viên Android là phải hiểu rằng (a) nếu họ hỗ trợ Android 26 trở lên, họ có triển khai java.time tích hợp, (b) nếu hỗ trợ Android sớm trước 26, họ phải thêm thư viện , thư viện ThreeTenABP và (c) nếu sử dụng ThreeTenABP , biết rằng thư viện này thực sự là một bản chuyển thể của ThreeTen-Backport được điều chỉnh từ Java sang Android. Các ThreeTenABP thư viện chỉ là một wrapper Android cụ thể xung quanh ThreeTen-backport thư viện. Xem bảng này đồ họa so sánh 3 thư viện.
Basil Bourque

@BasilBourque bạn hoàn toàn chính xác. Tuy nhiên, trên thực tế bạn có thể nhập ThreeTen-Backport và sử dụng nó trong ứng dụng Android, nhưng với tác động cực kỳ lớn đến hiệu suất gây ra sự phụ thuộc JAR của nó. Đây là lý do tại sao tôi đã nói rằng bài đăng phải cụ thể hơn rằng các nhà phát triển Android không bao giờ nên sử dụng ThreeTen-Backport và thay vào đó sử dụng ThreeTenABP cho API 25 trở xuống. Tôi đã thấy nhiều nhà phát triển trên nhiều bảng khác nhau bị nhầm lẫn về việc nên sử dụng cái nào cho Android, vì chúng có vẻ giống nhau theo tên.
Slobodan Antonijević

Điểm tốt, @ SlobodanAntonijević. Tôi đã cố gắng làm cho nó rõ ràng hơn một chút.
Ole VV

1
@ SlobodanAntonijević Bảng này cho biết nơi nhận java.time cho cả Java và Android có thể giúp làm rõ.
Basil Bourque

3

Giải pháp trong Kotlin:

val nowInEpoch = Instant.now().epochSecond

Đảm bảo phiên bản SDK tối thiểu của bạn là 26.


0

Tôi khuyên bạn nên sử dụng câu trả lời của Lượt truy cập, nhưng thêm định dạng Địa điểm, đây là cách Nhà phát triển Android khuyên dùng :

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

Mã này là phiên bản Kotlin. Tôi có một ý tưởng khác để thêm một số nguyên ngẫu nhiên ngẫu nhiên trong chữ số cuối cùng để đưa ra thời gian kỷ nguyên phương sai.

Phiên bản Kotlin

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

val deltaEpoch = oldEpoch - currentEpoch

Tôi nghĩ sẽ tốt hơn khi sử dụng kode này sau đó phụ thuộc vào phiên bản Android 26 trở lên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.