【问题标题】:Android Get Current timestamp?Android获取当前时间戳?
【发布时间】:2011-12-26 00:36:51
【问题描述】:

我想像这样获取当前时间戳:1320917972

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

【问题讨论】:

  • 仅供参考,java.util.Datejava.util.CalendarTimestamp 等麻烦的旧日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。在ThreeTenABP 项目中进一步适用于早期的Android。见How to use ThreeTenABP…

标签: java android kotlin timestamp epoch


【解决方案1】:

这里是最广为人知的方法的比较列表

【讨论】:

    【解决方案2】:

    您可以通过尝试以下代码在 Android 中获取当前时间戳

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

    时间戳到时间格式

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

    【讨论】:

      【解决方案3】:

      此代码是 Kotlin 版本。我有另一个想法,在最后一位添加一个随机洗牌整数,以提供方差时代时间。

      Kotlin 版本

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

      我认为使用这个 kode 会更好,然后依赖于 android 版本 26 或更高版本

      【讨论】:

        【解决方案4】:

        java.time

        我想提供现代答案。

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

        刚刚运行时的输出:

        1543320466

        虽然除以 1000 不会让很多人感到意外,但自己进行时间换算可能很难快速阅读,所以在可以避免的时候养成这个坏习惯。

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

            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 Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
        • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

        链接

        【讨论】:

        • 几乎完美的答案(我赞成)但是,至少在我的诚实意见中,您应该删除 ThreeTen Backport 参考,因为这是一个关于 Android 而不是一般 Java 的问题。 Android 初学者可能会感到困惑。
        • @SlobodanAntonijević 对于 Android 程序员来说,理解这一点很重要(a)如果他们支持 Android 26 及更高版本,他们有一个内置的 java.time 实现, (b)如果支持26之前的早期Android,则必须添加一个库,即ThreeTenABP库,以及(c)如果使用ThreeTenABP,要知道这个库实际上是一个改编ThreeTen-Backport 从 Java 改编到 Android。 ThreeTenABP 库只是围绕 ThreeTen-Backport 库的 Android 特定包装器。请参阅this table graphic 比较这 3 个库。
        • @BasilBourque 你是完全正确的。但是,您实际上可以导入 ThreeTen-Backport 并在 Android 应用程序中使用它,但是由于其 JAR 依赖关系,对性能的影响非常大。这就是为什么我说这篇文章应该更具体地说明 Android 开发人员不应该使用 ThreeTen-Backport,而是使用 ThreeTenABP 来支持 API 25 及以下版本。我在各种板上看到了许多开发人员,他们对应该为 Android 使用哪一个感到困惑,因为它们的名字听起来很相似。
        • 好点,@SlobodanAntonijević。我试着让它更清楚一点。
        • @SlobodanAntonijević This table 显示在哪里获取 Java 和 Android 的 java.time 可能有助于弄清楚。
        【解决方案5】:

        Kotlin 中的解决方案:

        val nowInEpoch = Instant.now().epochSecond
        

        确保您的最低 SDK 版本为 26。

        【讨论】:

          【解决方案6】:

          1320917972 是 Unix 时间戳,使用自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。您可以使用 TimeUnit 类进行单位转换 - 从 System.currentTimeMillis() 到秒。

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

          【讨论】:

            【解决方案7】:

            我建议使用 Hits 的答案,但添加一个 Locale 格式,这就是 Android 的方式 开发者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;
                }
            

            【讨论】:

              【解决方案8】:

              使用很简单:

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

              如果你想要它的特定格式,那么你需要像下面这样的格式化程序

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

              【讨论】:

              • 这给出了 GMT 时间。
              【解决方案9】:

              使用以下方法获取当前时间戳。对我来说效果很好。

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

              【讨论】:

              • 那不是时间戳。
              • @Hits,这是简单的日期格式,而不是时间戳。您只是使用变量名作为 currentTimeStap。
              【解决方案10】:

              这是一个人类可读的时间戳,可用于文件名, 以防万一有人需要我需要的东西:

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

              【讨论】:

              • 嘿,你能告诉我对时间戳列表进行排序的最佳方法吗?我正在考虑自己对它们进行分类,但认为可能有更好的方法。
              • 供阅读本文的任何人参考,请注意“android.text.format.Time”现已弃用
              【解决方案11】:

              解决办法是:

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

              【讨论】:

              • 这不考虑设备的时区偏移量。
              • @kjdion84 对不起,但你为什么认为这很重要?只是基于这个问题。
              • 有没有办法把它变成int
              【解决方案12】:

              您可以使用SimpleDateFormat 类:

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

              【讨论】:

              • 这不是时间戳(自纪元以来的时间)
              • 不是时间戳,而且根本没有效率(创建 SimpleDateFormat,创建日期,转换)。避免它。
              • 你在回答其他问题,但它也是有效的。
              【解决方案13】:

              来自开发者博客:

              System.currentTimeMillis() 是标准的“挂钟”(时间和日期),表示自纪元以来的毫秒数。挂钟可由用户或电话网络设置(见setCurrentTimeMillis(long)),因此时间可能会意外地向后或向前跳跃。仅当与现实世界的日期和时间的对应关系很重要时才应使用此时钟,例如在日历或闹钟应用程序中。间隔或经过时间测量应使用不同的时钟。如果您使用System.currentTimeMillis(),请考虑收听ACTION_TIME_TICKACTION_TIME_CHANGEDACTION_TIMEZONE_CHANGED Intent 广播以了解时间何时更改。

              【讨论】:

              • 来自developer.android.com/reference/java/lang/…我发现System.nanoTime()System.currentTimeMillis()的替代品,它没有不可预测的波动,专为测量时长差异而设计。
              • @ana01 “零值通常是设备最后一次启动的时间” - 所以它只能在您比较同一设备上的持续时间差异时使用。例如,对数据库存储没有用处。
              • 只是对@ana01 的评论指出System.nanoTime() 不适合显示挂钟时间。为此,请改用System.currentTimeMillis()
              猜你喜欢
              • 2021-12-04
              • 2017-02-15
              • 2012-03-04
              • 2011-02-16
              • 1970-01-01
              • 2013-03-10
              • 2010-12-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多