【问题标题】:How to get the time since midnight in seconds如何以秒为单位获取自午夜以来的时间
【发布时间】:2013-09-29 06:18:46
【问题描述】:

首先,这是我在 Java 1 课程中遇到的一个简单问题。这是一个静态时间,我已经设置为“今天”8:49:12,我要弄清楚午夜过后多少秒和“到”午夜这代表了多少秒。 8 小时 49 分 12 秒。 这是我现在的代码:

hour    = 8;
minute  = 59;
second  = 32;
System.out.println("The static time used for this program was: " + hour + ":" + minute + ":" + second);

我的问题是,我不知道如何获取午夜开始的时间。

所以基本上输出需要是:

Number of seconds since midnight: 
Number of seconds to midnight:

后面的空格是秒数。

谢谢,请解释原因,以及您如何选择如何解决此问题。我想学:P

【问题讨论】:

标签: java time clock


【解决方案1】:
final static int SEC_IN_MIN = 60;
final static int SEC_IN_HOUR = SEC_IN_MIN * 60;
int secFromMidnight = hour * SEC_IN_HOUR + minute * SEC_IN_MIN + second;
int secToMidnight = (24 * SEC_IN_HOUR) - secFromMidnight;

【讨论】:

    【解决方案2】:

    试试这个简单的数学:

    System.out.println("Number of seconds since midnight:" +(second + (minute*60) + (hour*3600)));
    System.out.println("Number of seconds to midnight:" +((60-second) + ((60-1-minute)*60) + (24-1-hour)*3600));
    

    【讨论】:

    • 这是最接近老师给我的实际答案。
    • @TaylorTDHouse 根据您希望结果的准确程度,并非每天都是 24 小时
    【解决方案3】:

    您的答案在 java.util.Calendar 类中。请参阅 get()/set() 方法: http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html

    【讨论】:

    • 不正确,从午夜开始的秒数没有方法。
    【解决方案4】:
    import java.util.Calendar;
    
    public class HelloWorld{
    
     public static void main(String []args){
        int hour    = 8;
        int minute  = 59;
        int second  = 32;
        System.out.println("The static time used for this program was: " + hour + ":" + minute + ":" + second);
        final Calendar currentTime = Calendar.getInstance();
        currentTime.set(2013,Calendar.SEPTEMBER,24,8,59,32);
        final Calendar midNight = Calendar.getInstance();
        midNight.clear();
        midNight.set(2013, Calendar.SEPTEMBER, 25);
        System.out.println(.001*(midNight.getTimeInMillis() - currentTime.getTimeInMillis()));
     }
    

    }

    考虑使用Calendar 或尝试JodaTime

    http://www.joda.org/joda-time/

    【讨论】:

      【解决方案5】:

      考虑到时间的特性,您可以简单地使用Calendar API

      Calendar fromMidnight = Calendar.getInstance();
      fromMidnight.set(Calendar.HOUR, 0);
      fromMidnight.set(Calendar.MINUTE, 0);
      fromMidnight.set(Calendar.SECOND, 0);
      fromMidnight.set(Calendar.MILLISECOND, 0);
      
      Calendar toMidnight = Calendar.getInstance();
      toMidnight.setTime(fromMidnight.getTime());
      toMidnight.add(Calendar.DATE, 1);
      
      System.out.println(fromMidnight.getTime());
      System.out.println(toMidnight.getTime());
      
      Calendar toFromTime = Calendar.getInstance();
      toFromTime.set(Calendar.HOUR, 8);
      toFromTime.set(Calendar.MINUTE, 59);
      toFromTime.set(Calendar.SECOND, 32);
      toFromTime.set(Calendar.MILLISECOND, 0);
      
      long secondsFromMidnight = (toFromTime.getTimeInMillis() - fromMidnight.getTimeInMillis()) / 1000;
      long secondsToMidnight = (toMidnight.getTimeInMillis() - toFromTime.getTimeInMillis()) / 1000;
      
      System.out.println("from = " + secondsFromMidnight + "; to " + secondsToMidnight);
      

      哪些输出...

      from = 32372; to 54028
      

      或者你可以使用JodaTime...

      MutableDateTime now = MutableDateTime.now();
      now.setMillisOfDay(0);
      now.setSecondOfDay(32);
      now.setMinuteOfDay(59);
      now.setHourOfDay(8);
      DateTime fromMidnight = now.toDateTime().toDateMidnight().toDateTime();
      DateTime toMidnight = fromMidnight.plusDays(1);
      
      Duration duration = new Duration(fromMidnight, toMidnight);
      
      Duration dFromMidnight = new Duration(fromMidnight, now);
      System.out.println("From midnight: " + dFromMidnight.getStandardSeconds());
      
      Duration dToMidnight = new Duration(now, toMidnight);
      System.out.println("To Midnight: " + dToMidnight.getStandardSeconds());
      

      哪些输出...

      From midnight: 32372
      To Midnight: 54028
      

      【讨论】:

        【解决方案6】:

        JAVA 中有一个名为TimeUnit 的枚举,它可以将时间转换为任何时间单位,如下所示:

                int hour    = 8;
                int minute  = 59;
                int second  = 32;
                System.out.println("The static time used for this program was: " + hour + ":" + minute + ":" + second);
        
                long secInMidnight = TimeUnit.HOURS.toSeconds(24);
                long timeInSeconds = (TimeUnit.HOURS.toSeconds(8) + TimeUnit.MINUTES.toSeconds(minute) + second);
        
                System.out.println("\nSince midnight: " + timeInSeconds + "\nUntil midnight: " + (secInMidnight - timeInSeconds) );
        

        【讨论】:

          【解决方案7】:

          由于问题的数学简单性,@Vimal Bera 的公认答案很好并且完全足够。但是,如果您仍然喜欢“形式化”(由库支持)方法而不进行“大量”计算,那么您可以在 Java-8 中执行此操作:

          LocalTime time = LocalTime.of(8, 59, 32);
          System.out.println(
            "Seconds since midnight: " 
            + time.get(ChronoField.SECOND_OF_DAY)); // 32372
          System.out.println(
            "Seconds to midnight: " 
            + (86400 - time.get(ChronoField.SECOND_OF_DAY))); // 54028
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-23
            • 1970-01-01
            • 2019-07-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多