ChatGPT解决这个技术问题 Extra ChatGPT

Android Get Current timestamp?

I want to get the current timestamp like that : 1320917972

int time = (int) (System.currentTimeMillis());
Timestamp tsTemp = new Timestamp(time);
String ts =  tsTemp.toString();
FYI, the troublesome old date-time classes such as java.util.Date, java.util.Calendar, and Timestamp are now legacy, supplanted by the java.time classes. Most of the java.time functionality is back-ported to Java 6 & Java 7 in the ThreeTen-Backport project. Further adapted for earlier Android in the ThreeTenABP project. See How to use ThreeTenABP….

R
Rjaibi Mejdi

The solution is :

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

This doesn't factor in the timezone offset of the device.
@kjdion84 excuse me, but why do you think it would be important ? Just based on the question.
Is there a way to get this as int?
T
Trung Nguyen

From developers blog:

System.currentTimeMillis() is the standard "wall" clock (time and date) expressing milliseconds since the epoch. The wall clock can be set by the user or the phone network (see setCurrentTimeMillis(long)), so the time may jump backwards or forwards unpredictably. This clock should only be used when correspondence with real-world dates and times is important, such as in a calendar or alarm clock application. Interval or elapsed time measurements should use a different clock. If you are using System.currentTimeMillis(), consider listening to the ACTION_TIME_TICK, ACTION_TIME_CHANGED and ACTION_TIMEZONE_CHANGED Intent broadcasts to find out when the time changes.


From developer.android.com/reference/java/lang/… I found that System.nanoTime() is an alternative to System.currentTimeMillis() and it has no unpredictable fluctuations, and is designed for measuring duration differences.
@ana01 "the zero value is typically whenever the device last booted" - so it can be used only when you compare duration differences on the same device. Not useful for database storage for example.
Just a note to @ana01 's comment that System.nanoTime() isn't suitable for to display wall clock time. For that purpose, use System.currentTimeMillis() instead.
H
Hocine B

1320917972 is Unix timestamp using number of seconds since 00:00:00 UTC on January 1, 1970. You can use TimeUnit class for unit conversion - from System.currentTimeMillis() to seconds.

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

P
Pratik Butani

You can use the SimpleDateFormat class:

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

This is not a timestamp (time since epoch)
Not a timestamp, and moreover, not efficiant at all (creation of SimpleDateFormat, creation of date, conversion). Avoid it.
You are answering sth else, but it's also valid.
H
Hits

Use below method to get current time stamp. It works fine for me.

/**
 * 
 * @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;
    }
}

That is not a timestamp.
@Hits, It's Simple Date Format, not a timestamp. You are just using variable name as currentTimeStap.
P
Pranav

It's simple use:

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

if you want it in particular format then you need Formatter like below

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

This gives GMT time.
M
Mujahid Khan

You can get Current timestamp in Android by trying below code

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

and timeStamp to time format

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

1
18446744073709551615

Here's a human-readable time stamp that may be used in a file name, just in case someone needs the same thing that I needed:

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;
    }

}

Hey, Could u also tell the best way to sort a list of timestamps? I was thinking of sorting them myself but thought there may be a better way.
For future reference for anybody reading this be aware that "android.text.format.Time" is now deprecated
D
DSavi

Solution in Kotlin:

val nowInEpoch = Instant.now().epochSecond

Make sure your minimum SDK version is 26.


u
ucMedia

https://i.stack.imgur.com/XKY91.png


O
Ole V.V.

java.time

I should like to contribute the modern answer.

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

Output when running just now:

1543320466

While division by 1000 won’t come as a surprise to many, doing your own time conversions can get hard to read pretty fast, so it’s a bad habit to get into when you can avoid it.

The Instant class that I am using is part of java.time, the modern Java date and time API. It’s built-in on new Android versions, API level 26 and up. If you are programming for older Android, you may get the backport, see below. If you don’t want to do that, understandably, I’d still use a built-in conversion:

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

This is the same as the answer by sealskej. Output is the same as before.

Question: Can I use java.time on Android?

Yes, java.time works nicely on older and newer Android devices. It just requires at least Java 6.

In Java 8 and later and on newer Android devices (from API level 26) the modern API comes built-in.

In non-Android Java 6 and 7 get the ThreeTen Backport, the backport of the new classes (ThreeTen for JSR 310; see the links at the bottom).

On (older) Android use the Android edition of ThreeTen Backport. It’s called ThreeTenABP. And make sure you import the date and time classes from org.threeten.bp with subpackages.

Links

Oracle tutorial: Date Time explaining how to use java.time.

Java Specification Request (JSR) 310, where java.time was first described.

ThreeTen Backport project, the backport of java.time to Java 6 and 7 (ThreeTen for JSR-310).

ThreeTenABP, Android edition of ThreeTen Backport

Question: How to use ThreeTenABP in Android Project, with a very thorough explanation.


Almost perfect answer (I upvoted) but, at least in my honest opinion, you should remove the ThreeTen Backport reference as this is a question about Android and not Java in general. And it may get to be confusing for beginners at Android.
@SlobodanAntonijević It is important for Android programmers to understand that (a) if they are supporting Android 26 and later, they have an implementation of java.time built-in, (b) if supporting early Android before 26, they must add a library, the ThreeTenABP library, and (c) if using ThreeTenABP, know that this library is actually an adaptation of ThreeTen-Backport adapted from Java to Android. The ThreeTenABP library is just a Android-specific wrapper around ThreeTen-Backport library. See this table graphic comparing the 3 libraries.
@BasilBourque you are completely correct. But, you can in fact import ThreeTen-Backport and use it in an Android app, but with extremely huge impact to performance cause of its JAR dependency. This is why I've said that the post should be more specific that Android devs should never use ThreeTen-Backport, and instead use ThreeTenABP for API 25 and below support. I've seen numerous devs on various boards that get confused on which one should be used for Android, cause they sound similar by name.
Good point, @SlobodanAntonijević. I have tried to make it just a little clearer.
@SlobodanAntonijević This table showing where to obtain java.time for both Java and Android might help make it clear.
N
Notron

Here is another solution, this is in kotlin:

val df: DateFormat = SimpleDateFormat("yyyy.MM.dd HH:mm:ss")
val timeStamp = df.format(Calendar.getInstance().time)

Output example:

"2022.04.22 10:22:35"


To get milliseconds just add the pattern like this: SimpleDateFormat("yyyy.MM.dd HH:mm:ss:SSS")
F
Faustino Gagneten

I suggest using Hits's answer, but adding a Locale format, this is how Android Developers recommends:

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;
    }

2
2 revs

This code is Kotlin version. I have another idea to add a random shuffle integer in last digit for giving variance epoch time.

Kotlin version

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

val deltaEpoch = oldEpoch - currentEpoch

I think it will be better using this kode then depend on android version 26 or more