两个时间之间的时间差

33

我想以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);
    }
}

数据库中的数据是字符串还是日期实例? - JustDanyul
差距的大小是多少(秒,毫秒,天...)? - assylias
3
你已经尝试过什么了吗? - Egor
@assylias 我需要以hh:mm格式显示时间 例如 11:05 am - 12:30 pm = 01:25 - Niks
@Egor,我不知道该如何开始:( 请帮帮我。 - Niks
显示剩余2条评论
11个回答

57

要计算两个日期之间的差异,您可以尝试类似以下的代码:

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方法将每秒执行一次,因此您可以在其中编写要更新或计算的任何内容。 - Sanober Malik
我已经检查了代码并修复了问题。很抱歉回复晚了!现在代码可以正常工作了。 - Sanober Malik
代码完全正常,但它仍然不能每秒更新一次。请尝试解决。 - Niks
我需要你的另一个帮助。你能否现在更新这段代码,因为我需要使用系统时间和手动时间来执行我的任务,并且每秒钟更新差异。例如: 系统时间:下午01:00:00 手动时间:下午12:50:00 答案:当时钟到达下午01:00:00时为00:10, 然后当时钟到达下午01:01:00时为00:11, 然后当时钟到达下午01:02:00时为00:12, 以此类推,请帮忙。 - Niks
@SanoberMalik 只是一个小提示:按照惯例,变量名应以小写字母开头。 - Daniel Kvist
显示剩余2条评论

10

终于做到了 yuppiiieee...

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

}

7

使用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类仅适用于一天内的时间,不考虑跨越午夜的情况。如果您想要跨越日期,请使用ZonedDateTimeOffsetDateTimeLocalDateTime,它们是日期时间对象而不是仅限于时间。

Duration表示与时间线无关的时间段。

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

调用toString方法会生成标准的ISO 8601 持续时间格式文本:PnYnMnDTnHnMnS,其中P表示开始时间,T将年月日与时分秒分开。我强烈建议使用此格式,而不是与钟表时间不明确的“HH:MM:SS”格式。
如果您坚持使用含糊不清的钟表时间格式,在Java 9及更高版本中,您可以通过调用toHoursParttoMinutesParttoSecondsPart来构建该字符串。
在您的示例数据中,我们向时间轴倒退,从晚上8点到晚上5点,因此结果是负小时数和负分钟数,即负2.5小时。

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

查看IdeOne.com上的在线代码运行

关于java.time

java.time框架内置于Java 8和更高版本中。这些类代替了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormatJoda-Time项目现在处于维护模式,建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。在Stack Overflow上搜索许多示例和解释。规范是JSR 310
从哪里获取java.time类?

ThreeTen-Extra 项目扩展了 java.time 的其他类。该项目是 java.time 可能未来添加的类的试验场。您可能会在此处找到一些有用的类,例如 IntervalYearWeekYearQuarter 等。更多信息


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;在日志记录中


嗨,如何以与上面(分钟、小时)相同的格式获取秒数? - Naveen

2
大致过程如下:
  1. Convert your string instance to a date instance the following way

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date date = format.parse("2011-01-03");
    
  2. Assuming the systemTime you have is a long, representing miliseconds since the epoc, you can now do the following

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

    where longNow is your current variable containing system time.


终于我得到了我真正想要的,感谢大家的建议、代码、示例和帮助,朋友们... - Niks

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

0

大家好,我不确定自己做错了什么,但这对我有所帮助,希望我能帮助其他人。

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

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

编程愉快


0

如果你想要正确的时间差,请在此函数中添加时区,这是一个常见的错误。试试这个函数。

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
}

0

尝试以下代码获取两个时间之间的小时和分钟差异:

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

0

我在寻找一种方法,可以从 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}"
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接