【问题标题】:Time difference between two times两次之间的时间差
【发布时间】:2013-03-12 11:38:10
【问题描述】:

我想以 hh:mm 格式显示两次之间的差异。

第一次来自数据库,第二次是系统时间。时差每秒更新一次。

我该怎么做?

目前我正在使用两个手动时间,如果这可以完美运行,那么我将其实施到我的应用中。

public class MainActivity extends Activity 
{
    TextView mytext;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Timer updateTimer = new Timer();
        updateTimer.schedule(new TimerTask() 
        {
            public void run() 
            {
                try 
                {
                    TextView txtCurrentTime= (TextView)findViewById(R.id.mytext);
                    SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");
                    Date date1 = format.parse("08:00:12 pm");
                    Date date2 = format.parse("05:30:12 pm");
                    long mills = date1.getTime() - date2.getTime();
                    Log.v("Data1", ""+date1.getTime());
                    Log.v("Data2", ""+date2.getTime());
                    int hours = (int) (mills/(1000 * 60 * 60));
                    int mins = (int) (mills % (1000*60*60));

                    String diff = hours + ":" + mins; // updated value every1 second
                    txtCurrentTime.setText(diff);
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }

        }, 0, 1000);
    }
}

【问题讨论】:

  • 数据库中的那个是字符串还是日期实例?
  • 差异有多大(秒、毫秒、天...)?
  • 你已经尝试过了吗?
  • @assylias 我需要 hh:mm 格式,例如上午 11:05 - 下午 12:30 = 01:25
  • @JustDanyul 字符串实例

标签: android time


【解决方案1】:

要计算两个日期之间的差异,您可以尝试以下方法:

long millis = date1.getTime() - date2.getTime();
int hours = (int) (millis / (1000 * 60 * 60));
int mins = (int) ((millis / (1000 * 60)) % 60);

String diff = hours + ":" + mins; 

要每秒更新时差,您可以使用 Timer。

Timer updateTimer = new Timer();
updateTimer.schedule(new TimerTask() {
    public void run() {
        try {
            long mills = date1.getTime() - date2.getTime();
                int hours = millis/(1000 * 60 * 60);
                 int mins = (mills/(1000*60)) % 60;

                 String diff = hours + ":" + mins; // updated value every1 second
            } catch (Exception e) {
            e.printStackTrace();
        }
    }

}, 0, 1000); // here 1000 means 1000 mills i.e. 1 second

编辑:工作代码:

public class MainActivity extends Activity {

    private TextView txtCurrentTime;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtCurrentTime= (TextView)findViewById(R.id.mytext);
        Timer updateTimer = new Timer();
        updateTimer.schedule(new TimerTask() 
        {
            public void run() 
            {
                try 
                {
                    
                    SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");
                    Date date1 = format.parse("08:00:12 pm");
                    Date date2 = format.parse("05:30:12 pm");
                    long mills = date1.getTime() - date2.getTime();
                    Log.v("Data1", ""+date1.getTime());
                    Log.v("Data2", ""+date2.getTime());
                    int hours = (int) (mills/(1000 * 60 * 60));
                    int mins = (int) (mills/(1000*60)) % 60;

                    String diff = hours + ":" + mins; // updated value every1 second
                    txtCurrentTime.setText(diff);
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }

        }, 0, 1000);
    }

【讨论】:

  • 这里的 run 方法每秒都会执行一次,所以无论你想更新或计算什么,你都可以在里面写..
  • 我已经检查了代码并解决了问题。抱歉回复晚了!现在代码正在运行。
  • yaa 代码运行良好,但仍然不是每秒更新一次。请尝试解决它...
  • 我需要你的另一个帮助。您现在可以更新此代码吗?我需要使用系统时间和手动时间来执行我的任务。然后每秒更新一次差异。比如系统时间:- 01:00:00 pm 手动时间:- 12:50:00 pm ans :- 00:10 当时钟到达 01:00:00 pm 然后 00:11 当时钟到达 01:01:00 pm 然后00:12 当时钟到达 01:02:00 pm 等等请帮助
  • 让我再试一次,你的代码非常适合我,但我需要它来更新。我的任务是获得两次第一次是手动和第二次是系统时间之间的差异。如果我设置手动时间 12:50:00 pm 和系统时间 01:00:00 pm 那么我需要回答 00:10,1 分钟后我需要回答 00:11,依此类推。
【解决方案2】:

终于成功了 yuppiiieeee ...

package com.timedynamicllyupdate;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity 
{
    TextView current;
    private TextView txtCurrentTime;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Thread myThread = null;
        Runnable myRunnableThread = new CountDownRunner();
        myThread= new Thread(myRunnableThread);   
        myThread.start();

        current= (TextView)findViewById(R.id.current);
    }


    public void doWork() 
    {
        runOnUiThread(new Runnable() 
        {
            public void run() 
            {
                try
                {
                    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss aa");

                    txtCurrentTime= (TextView)findViewById(R.id.mytext);

                    Date systemDate = Calendar.getInstance().getTime();
                    String myDate = sdf.format(systemDate);
//                  txtCurrentTime.setText(myDate);

                    Date Date1 = sdf.parse(myDate);
                    Date Date2 = sdf.parse("02:50:00 pm");

                    long millse = Date1.getTime() - Date2.getTime();
                    long mills = Math.abs(millse);

                    int Hours = (int) (mills/(1000 * 60 * 60));
                    int Mins = (int) (mills/(1000*60)) % 60;
                    long Secs = (int) (mills / 1000) % 60;

                    String diff = Hours + ":" + Mins + ":" + Secs; // updated value every1 second
                    current.setText(diff);
                }
                catch (Exception e) 
                {

                }
            }
        });
    }

    class CountDownRunner implements Runnable
    {
        // @Override
        public void run() 
        {
            while(!Thread.currentThread().isInterrupted())
            {
                try 
                {
                    doWork();
                    Thread.sleep(1000); // Pause of 1 Second
                } 
                catch (InterruptedException e) 
                {
                        Thread.currentThread().interrupt();
                }
                catch(Exception e)
                {
                }
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

【讨论】:

    【解决方案3】:

    使用 java.time

    现代方法是使用 java.time 类来取代麻烦的旧日期时间类。

    LocalTime 类表示没有日期和时区的时间。

    使用DateTimeFormatter 类定义格式模式。

    String inputStart = "08:00:12 pm".toUpperCase() ;
    String inputStop = "05:30:12 pm".toUpperCase() ;
    
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "hh:mm:ss a" );
    LocalTime start = LocalTime.parse( inputStart , f );
    LocalTime stop = LocalTime.parse( inputStop , f );
    

    start.toString(): 20:00:12

    stop.toString(): 17:30:12

    LocalTime 类在一个通用的一天 24 小时内工作。所以它不考虑穿越午夜。如果您想在几天之间交叉,您应该使用 ZonedDateTimeOffsetDateTimeLocalDateTime,而不是所有日期时间对象,而不是仅时间。

    Duration 捕获未附加到时间线的时间跨度。

    Duration d = Duration.between( start , stop );
    

    调用toString 会生成标准ISO 8601 format for durations 中的文本:PnYnMnDTnHnMnS 其中P 标志着开始,T 将年-月-日与小时-分钟-秒分开。我强烈建议使用这种格式,而不是与时钟时间模棱两可的“HH:MM:SS”格式。

    如果您坚持使用不明确的时钟时间格式,在 Java 9 及更高版本中,您可以通过调用 toHoursParttoMinutesParttoSecondsPart 来构建该字符串。

    在您的示例数据中,我们在时间上向后移动,从晚上 8 点到下午 5 点,因此结果是小时数和分钟数为负数,即负数为两个半小时。

    d.toString(): PT-2H-30M

    看到这个code run live at IdeOne.com


    关于java.time

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

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

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

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      【解决方案4】:

      好的,我在这里为您构建功能:

       public void omriFunction(){
          Date Start = null;
          Date End = null;
          SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
          try {
              Start = simpleDateFormat.parse(04+":"+30);
              End = simpleDateFormat.parse(06+":"+45);}
          catch(ParseException e){
              //Some thing if its not working
          }
      
          long difference = End.getTime() - Start.getTime();
          int days = (int) (difference / (1000*60*60*24));
          int hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60));
          int min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / (1000*60);
          if(hours < 0){
              hours+=24;
          }if(min < 0){
              float  newone = (float)min/60 ;
              min +=60;
              hours =(int) (hours +newone);}
          String c = hours+":"+min;
          Log.d("ANSWER",c);}
      

      回答:2:15;在日志中

      【讨论】:

      • 嗨,如何以与上述相同的格式(分钟,小时)获得秒数?
      【解决方案5】:

      流程大致如下,

      1. 通过以下方式将您的字符串实例转换为日期实例

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = format.parse("2011-01-03");
        
      2. 假设您拥有的 systemTime 很长,表示自 epoc 以来的毫秒数,您现在可以执行以下操作

        long difference = longNow - date.getTime();
        int msPerHour = 1000*60*60;
        int hours = difference/secondPerHour;
        int minutes = difference % secondPerHour;
        

        其中longNow 是包含系统时间的当前变量。

      【讨论】:

      • 我终于明白了,我真正想做的事感谢大家的建议、代码、示例和帮助 frndzzzz...
      【解决方案6】:
      Date currentTime = parseDate("11:27:20 AM");
      Date endTime = parseDate("10:30:01 AM");
      
      if (endTime.before(currentTime))
      {
          Log.e("Time :","===> is before from current time");
      }
      
      if (endTime.after(currentTime))
      {
          Log.e("Time :","===> is after from current time");
      }
      
      
      
      private Date parseDate(String date)
      {
          String inputFormat = "hh:mm:ss aa";
          SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US);
          try {
              return inputParser.parse(date);
          } catch (java.text.ParseException e) {
              return new Date(0);
          }
      }
      

      【讨论】:

        【解决方案7】:

        大家好,不知道我做错了什么,但这对我有帮助,希望我能帮助别人。

        我的最小值是以某种浮点格式计算的,所以我使用了这个公式

        long Min = time %  (1000*60*60)/(60*1000);
        time is my date2.getTime() - date1.getTime();
        

        快乐编码

        【讨论】:

          【解决方案8】:

          Tray 下面的代码可以让两个时间的小时和分钟不同:

          private static int getHoursDiff(Calendar c1, Calendar c2) {
                      Date d1 = c1.getTime();
                      Date d2 = c2.getTime();
                      long mils = d1.getTime() - d2.getTime();
                      int hourDiff = (int) (mils / (1000 * 60 * 60));
                      return hourDiff;
                  }
          
                  private static int getMinuteDiff(Calendar c1, Calendar c2) {
                      Date d1 = c1.getTime();
                      Date d2 = c2.getTime();
                      long mils = d1.getTime() - d2.getTime();
                      int minuteFor = (int) (mils / (1000 * 60) % 60);
                      return minuteFor;
                  } }
          

          【讨论】:

            【解决方案9】:

            所以我一直在寻找一种可以从 Kolin 的 2 次获得 HH/MM/SS 的方法,这似乎是一个不错的方法。

            它使用import org.threeten.bp

            fun getTimedifference(startTime: LocalDateTime,  endTime: LocalDateTime): String {
                    val startTimeInstant = startTime.atOffset(ZoneOffset.UTC).toInstant()
                    val endTimeInstant = endTime.atOffset(ZoneOffset.UTC).toInstant()
                    val duration = Duration.between(startTimeInstant, endTimeInstant)
                    val days = duration.toDays()
                    val hours = duration.toHours() - (days * 24)
                    val min = duration.toMinutes() - (duration.toHours() * 60)
                    val sec = (duration.toMillis() / 1000) - (duration.toMinutes() * 60)
                    return "${hours}:${min}:${sec}"
                }
            

            【讨论】:

              【解决方案10】:

              试试这个功能,如果你想要正确的时差,你必须在其中添加时区,这是一个正常的错误。

              fun main() {
                  val format = "MM/dd/yyyy hh:mm:ss aa"
                  val cal = Calendar.getInstance()
                  val sdf =  SimpleDateFormat(format, Locale.getDefault())
                  sdf.setTimeZone(TimeZone.getTimeZone("Asia/Karachi")) //make sure to set timezone
                  
                  val arrivedDate = "03/15/2022 12:00:00 PM"
                  val currentDate = sdf.format(cal.timeInMillis)
                  
                  print("Arrived time: " + arrivedDate + "\n")
                  print("Current time: " + currentDate + "\n")
                  
                  val arrivedDateMillis = getLongDateFromString(arrivedDate, sdf) 
                  val currentDateMillis = getLongDateFromString(currentDate, sdf)
                 
                  val diff = (currentDateMillis - arrivedDateMillis) / 1000
                  
                  val p1 = diff % 60
                  var p2 = diff / 60  
                  val p3 = p2 % 60
                  val p4 = diff / 60 / 60 / 24
                  p2 = p2 / 60 % 24
              
                  print("$p4:$p2:$p3:$p1") //days:hours:minutes:seconds
                 
              }
              
              fun getLongDateFromString(time: String, format: SimpleDateFormat): Long {
                  try {
                      val date = format.parse(time)
                      return date.time
              
                  } catch (e: Exception) {
                      e.printStackTrace()
                  }
                  return 0L
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-04-01
                • 1970-01-01
                • 1970-01-01
                • 2018-04-03
                • 1970-01-01
                • 2019-04-14
                • 2015-02-22
                • 1970-01-01
                相关资源
                最近更新 更多