【问题标题】:How do I say 5 seconds from now in Java?在 Java 中我怎么说 5 秒后?
【发布时间】:2009-10-31 19:30:35
【问题描述】:

我正在查看日期 documentation 并试图弄清楚我如何表达现在 + 5 秒。这是一些伪代码:

import java.util.Date
public class Main {

    public static void main(String args[]) {
         Date now = new Date();
         now.setSeconds(now.getSeconds() + 5);
    }
}

【问题讨论】:

    标签: java date


    【解决方案1】:

    来自单行黑客部门:

    new Date( System.currentTimeMillis() + 5000L)

    我从您的示例中了解到,“现在”确实是“现在”,而“System.currentTimeMillis()”恰好代表相同的“现在”概念 :-)

    但是,是的,对于比 Joda time API 更复杂的事情。

    【讨论】:

      【解决方案2】:

      Date 几乎完全被弃用,出于向后兼容的原因仍然存在。如果您需要设置特定日期或进行日期运算,请使用Calendar

      Calendar calendar = Calendar.getInstance(); // gets a calendar using the default time zone and locale.
      calendar.add(Calendar.SECOND, 5);
      System.out.println(calendar.getTime());
      

      【讨论】:

      • 几乎完全弃用是否意味着如果我的客户升级他们的 JVM,它会崩溃?废话……这可能真的很糟糕。他们为什么要杀死伊达?!
      • 非常非常罕见地从 JRE 中真正删除了已弃用的内容,并且通常只有在功能有害时才会这样做。我认为在接下来的几个主要版本中没有删除 Date 的危险。它已被弃用,因为它有一些严重的缺点,但它会继续存在。
      • @Karl 我对 Joachim 的回答没有什么要补充的。
      • @Karl,作为本示例中的 FYI calendar.getTime() 返回日期。我不认为他们弃用 Date 的程度不如弃用它的某些功能。
      • @Tuntable Joda-Time 项目被JSR 310 中定义的java.time 类所继承,可怕的Date/Calendar 类也是如此。例如:java.time.Instant.now().plusSeconds( 5 )
      【解决方案3】:

      tl;博士

      Instant             // Use modern `java.time.Instant` class to represent a moment in UTC.
      .now()              // Capture the current moment in UTC.
      .plusSeconds( 5 )   // Add five seconds into the future. Returns another `Instant` object per the Immutable Objects pattern.
      

      java.time

      使用现代的 java.time 类,它在几年前取代了可怕的 DateCalendar 类。

      UTC

      要使用 UTC,请使用 Instant

      Instant later = Instant.now().plusSeconds( 5 ) ;
      

      时区

      要在特定时区工作,请使用ZonedDateTime

      ZoneId z = ZoneId.of( "America/Montreal" ) ;
      ZonedDateTime later = ZonedDateTime.now( z ).pluSeconds( 5 ) ;
      

      Duration

      您可以对要添加的时间量和粒度进行软编码。使用Duration 类。

      Duration d = Duration.ofSeconds( 5 ) ;
      Instant later = Instant.now().plus( d ) ;  // Soft-code the amount of time to add or subtract.
      

      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time

      从哪里获取 java.time 类?

      【讨论】:

        【解决方案4】:

        正如其他人指出的那样,Joda 更容易:

        DateTime dt = new DateTime();
        DateTime added = dt.plusSeconds(5);
        

        我强烈建议您迁移到 Joda。几乎所有关于 SO 的 Java 日期相关问题都可以解决为 Joda 建议 :-) Joda API 应该是新标准 Java 日期 API (JSR310) 的基础,因此您将迁移到新标准。

        【讨论】:

        • "java.util.Date" 是“使用 Joda Time”,因为“Random 给了我重复的值”是“不要继续创建 Random 的新实例”:)
        【解决方案5】:

        你可以使用:

        now.setTime(now.getTime() + 5000);
        

        Date.getTime()setTime() 始终指自 UTC 时间 1970 年 1 月 1 日凌晨 12 点以来的毫秒数。

        乔达时间

        但是,如果您要做的不仅仅是最简单的日期/时间处理,我强烈建议您使用Joda Time。它是一个更多比 Java 中的内置支持更强大和更友好的库。

        DateTime later = DateTime.now().plusSeconds( 5 );
        

        java.time

        Joda-Time 后来启发了 Java 8 中内置的新 java.time package

        【讨论】:

        • 当我按 F5 时,您的帖子会填充越来越多的有用信息,这很神奇 =/
        • 使用日历怎么样?
        • 好吧,我不能让 java.util.Date 问题不提 Joda :)
        • @Nick:Calendar 是一个很难正确使用的 API,它不能让你表达“只是一个日期”(没有时间)或“一个本地日期/时间”等的想法. 去找乔达 :)
        • 好吧,给“现在”增加 5 秒,用时间表示日期似乎很有用:)
        【解决方案6】:

        忽略Dates并专注于问题。

        我的偏好是使用java.util.concurrent.TimeUnit,因为它使我的代码更加清晰。

        在 Java 中,

        long now = System.currentTimeMillis();
        

        now 使用TimeUtil 5 秒是:

        long nowPlus5Seconds = now + TimeUnit.SECONDS.toMillis(5);
        

        参考:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html

        【讨论】:

          【解决方案7】:
                  String serverTimeSync = serverTimeFile.toString();
                  SimpleDateFormat serverTime = new SimpleDateFormat("yyyy,MM,dd,HH,mm,ss");
                  Calendar c = Calendar.getInstance();
                  c.setTime(serverTime.parse(serverTimeSync));
                  c.add(Calendar.MILLISECOND, 15000);
                  serverTimeSync = serverTime.format(c.getTime());
          

          【讨论】:

          • 你能解释一下你的代码,并讨论它在几个现有答案之外增加的价值吗? Stack Overflow 的目的不仅仅是一个代码 sn-p 库。
          • 我有一个 timeprofile.txt 在 device.iwas read thrw andriod bufferreader.and 然后添加一个 15 秒忘记服务器时间
          【解决方案8】:

          试试这个..

              Date now = new Date();
              System.out.println(now);
          
              Calendar c = Calendar.getInstance();
              c.setTime(now);
              c.add(Calendar.SECOND, 5);
              now = c.getTime();
          
              System.out.println(now);
          
              // Output
              Tue Jun 11 16:46:43 BDT 2019
              Tue Jun 11 16:46:48 BDT 2019
          

          【讨论】:

          • 不,不要尝试这个。 CalendarDate 几乎完全被弃用。如今,这个问题的答案就像LocalDateTime result = LocalDateTime.now().plusSeconds(5); 一样琐碎。 (“琐碎”带有通常的免责声明:“......除非你在这 5 秒内通过一些奇怪的时区变化,yadda yadda......”)
          • @Marco13 不,永远不要使用LocalDateTime 来跟踪特定时刻,如其Javadoc 中所述。暂时使用ZonedDateTimeOffsetDateTimeInstant。例如:ZonedDateTime.now( ZoneId.systemDefault() ).plusSeconds( 5 )
          • 这个答案中使用的类很糟糕。太可怕了,以至于 Sun、Oracle 和 JCP 社区几年前就放弃了它们,采用了定义现代 java.time 类的 JSR 310。在 2019 年推荐这些遗留类是糟糕的建议。
          【解决方案9】:

          更新: 使用 java.time 类查看 my new Answer。我将把这个答案原封不动地保留为历史。


          Pascal Thivent 的The Answer 和 Jon Skeet 的 the Answer 既正确又好。这里有一些额外的信息。

          五秒 = PT5S (ISO 8601)

          另一种表达“五秒后”概念的方式是使用ISO 8601 定义的标准格式在字符串中。 duration/period format 有这种模式PnYnMnDTnHnMnS,其中P 标记开始,T 将日期部分与时间部分分开。

          所以五秒是PT5S

          乔达时间

          Joda-Time 2.8 库可以生成和解析此类持续时间/期间字符串。请参阅 PeriodDurationInterval 类。您可以在DateTime 对象中添加和减去 Period 对象。

          在 StackOverflow 上搜索许多示例和讨论。这是一个简单的例子。

          DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
          DateTime now = DateTime.now( zone );
          DateTime then = now.plusSeconds( 5 );
          Interval interval = new Interval( now, then );
          Period period = interval.toPeriod( );
          
          DateTime thenAgain = now.plus( period );
          

          转储到控制台。

          System.out.println( "zone: " + zone );
          System.out.println( "From now: " + now + " to then: " + then );
          System.out.println( "interval: " + interval );
          System.out.println( "period: " + period );
          System.out.println( "thenAgain: " + thenAgain );
          

          运行时。

          zone: America/Montreal
          From now: 2015-06-15T19:38:21.242-04:00 to then: 2015-06-15T19:38:26.242-04:00
          interval: 2015-06-15T19:38:21.242-04:00/2015-06-15T19:38:26.242-04:00
          period: PT5S
          thenAgain: 2015-06-15T19:38:26.242-04:00
          

          【讨论】:

            【解决方案10】:

            我刚从java docs找到这个

            import java.util.Calendar;
            
            public class Main {
            
              public static void main(String[] args) {
                Calendar now = Calendar.getInstance();
                System.out.println("Current time : " + now.get(Calendar.HOUR_OF_DAY) + ":"
                    + now.get(Calendar.MINUTE) + ":" + now.get(Calendar.SECOND));
            
                now.add(Calendar.SECOND, 100);
                System.out.println("New time after adding 100 seconds : " + now.get(Calendar.HOUR_OF_DAY) + ":"
                    + now.get(Calendar.MINUTE) + ":" + now.get(Calendar.SECOND));
              }
            }
            

            有什么我应该注意的约定吗?

            【讨论】:

            • 哇。如果编写正确,Java 可能会非常冗长。你的变量名只有三个字母!
            【解决方案11】:
            public class datetime {
            
                public String CurrentDate() {        
                    java.util.Date dt = new java.util.Date();
                    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
                    String currentTime = sdf.format(dt);
                    return currentTime;
                }
            
                public static void main(String[] args) {
                    class SayHello extends TimerTask {
                        datetime thisObj = new datetime();
                        public void run() {
                            String todaysdate = thisObj.CurrentDate();
                            System.out.println(todaysdate);
                        }
                    }
                    Timer timer = new Timer();
                    timer.schedule(new SayHello(), 0, 5000); 
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-29
              • 2011-11-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-23
              • 2021-10-18
              • 1970-01-01
              相关资源
              最近更新 更多