Android获取当前时间戳?


246

我想要这样的当前时间戳:1320917972

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

2
仅供参考,麻烦的旧日期,时间类,如java.util.Datejava.util.CalendarTimestamp现在的遗产,由取代java.time类。在ThreeTen-Backport项目中,大多数java.time功能都被反向移植到Java 6和Java 7 。在ThreeTenABP项目中进一步适用于早期的Android 。请参阅如何使用ThreeTenABP…
罗勒·布尔克

Answers:



82

来自开发人员博客:

System.currentTimeMillis()是表示自该纪元以来的毫秒数的标准“墙上”时钟(时间和日期)。挂钟可以由用户或电话网络设置(请参见setCurrentTimeMillis(long)),因此时间可能无法预测地向后或向前跳跃。仅当与实际日期和时间的对应关系很重要时才应使用此时钟,例如在日历或闹钟应用程序中。间隔或经过的时间测量应使用其他时钟。如果您正在使用System.currentTimeMillis(),考虑听ACTION_TIME_TICKACTION_TIME_CHANGEDACTION_TIMEZONE_CHANGED意向广播找出来的时候,时间的变化。


11
developer.android.com/reference/java/lang/…, 我发现它System.nanoTime()是替代方法,System.currentTimeMillis()并且没有不可预测的波动,并且旨在测量持续时间差异。
Bianca Daniciuc

2
@ ana01“零值通常是设备上次启动的时间”-因此只有在比较同一设备上的持续时间差异时才能使用该值。例如,对于数据库存储没有用。
2014年

1
只是@ ana01注释的注释,System.nanoTime()不适合显示墙上时钟时间。为此,请System.currentTimeMillis()改用。
Akash Agarwal,2016年

33

1320917972是Unix时间戳,使用的是自1970年1月1日00:00:00 UTC以来的秒数。您可以使用TimeUnitclass进行单位转换-从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
这不是一个时间戳(因为信号出现时间)
米哈尔ķ

1
不是时间戳,而且根本没有效率(创建SimpleDateFormat,创建日期,转换)。避开它。
2014年

您在回答其他问题,但这也是有效的。
ERSKS 2016年

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 2016年

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
嘿,您还能说出对时间戳列表进行排序的最佳方法吗?我当时想自己对它们进行排序,但认为可能会有更好的方法。
阿巴斯

供将来阅读的任何人参考,请注意,现已弃用“ android.text.format.Time”
jason.kaisersmith,2016年

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

虽然除以1000并不会让很多人感到意外,但您自己进行时间转换可能很难很快地读懂,因此在避免时要养成一个坏习惯。

Instant我正在使用的类是java.time(现代Java日期和时间API)的一部分。它内置在新的Android版本(API级别26及更高版本)中。如果您正在为较旧的Android编程,则可能会获得反向移植,请参见下文。如果您不想这样做,可以理解,我仍然会使用内置转换:

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

这与Sealskej的答案相同。输出与以前相同。

问题:我可以在Android上使用java.time吗?

是的,java.time在旧的和更新的Android设备上都能很好地工作。它至少需要Java 6

  • 在Java 8和更高版本以及更新的Android设备(来自API级别26)中,内置了现代API。
  • 在非Android Java 6和7中,获取ThreeTen反向端口,即新类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在旧版Android上,请使用Android版本的ThreeTen Backport。它称为ThreeTenABP。并确保您导入org.threeten.bp带有子包的日期和时间类。

链接


几乎完美的答案(我赞成),但至少,以我的诚实观点,您应该删除ThreeTen Backport参考,因为这是关于Android而不是Java的问题。对于Android初学者来说,这可能会造成混淆。
SlobodanAntonijević19年

1
@SlobodanAntonijević对于Android程序员来说,重要的是要了解(a)如果支持Android 26及更高版本,则内置了java.time的实现;(b)如果支持26之前的Android早期版本,则必须添加一个库,ThreeTenABP库,以及(c)如果使用ThreeTenABP,则知道该库实际上是从Java到Android 的ThreeTen-Backport的改编。该ThreeTenABP图书馆仅仅是围绕着Android的特定包装ThreeTen -反向移植库。参见下表比较这三个库。
罗勒·布尔克

@BasilBourque您完全正确。但是,实际上,您可以导入ThreeTen-Backport并在Android应用程序中使用它,但是由于其JAR依赖关系而对性能造成极大影响。这就是为什么我说这篇文章应该更具体地说明Android开发人员永远不要使用ThreeTen-Backport,而应该使用ThreeTenABP来支持API 25及以下版本。我已经看到各种开发板上的许多开发人员对应该在Android上使用哪种开发板感到困惑,因为它们的名称听起来很相似。
SlobodanAntonijević19年

好点,@SlobodanAntonijević。我试图使其更加清晰。
Ole VV

1
@SlobodanAntonijević下显示了从何处获取Java和Android的java.time可能有助于弄清楚。
罗勒·布尔克

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或更高版本

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.