2013-03-12 117 views
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); 
    } 
} 
+0

來自數據庫的是String還是Date實例? – JustDanyul 2013-03-12 11:39:48

+0

差異的大小(秒,毫秒,天......)是多少? – assylias 2013-03-12 11:39:53

+3

您是否嘗試過某些東西? – Egor 2013-03-12 11:40:02

回答

12

計算兩個日期之間的區別,你可以嘗試這樣的:

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

String diff = hours + ":" + mins; 

要更新時差每一秒,你可以使用定時器。

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); 
    } 
+0

我怎樣才能每秒更新差異....? – Niks 2013-03-12 12:02:34

+0

這裏的運行方法會執行每一秒,所以無論你想更新或計算你可以寫在裏面.. – 2013-03-12 12:09:27

+0

它不工作:( – Niks 2013-03-12 12:18:38

1

的過程大致如下,

  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是包含系統時的當前變量。

+0

終於我明白了,我真正想要做的就是感謝您的建議,代碼,示例和幫助frndzzzz ... – Niks 2013-03-13 09:36:27

8

終於做到了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; 
    } 

} 
1

好,我在這裏建Funcion你:

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;在logcat

0

嗨,大家不知道我在做什麼錯,但這對我有幫助,希望我能幫助別人。

我分是在一些浮點格式進行計算,所以我用這個公式

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

快樂編碼

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分十二秒

stop.toString():十七時30分十二秒

LocalTime類的工作中的單個通用24 - 小時。所以它不考慮過夜。如果你想跨越幾天,你應該使用ZonedDateTimeOffsetDateTimeLocalDateTime來代替所有日期 - 時間對象,而不是隻使用時間。

A Duration捕捉一段時間未連接到時間線。

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

調用toString標準ISO 8601format for durations生成文本:PnYnMnDTnHnMnS其中P標誌着開始和T從小時 - 分 - 秒分隔年,月,日。我強烈建議使用這種格式,而不是時鐘模糊的「HH:MM:SS」格式。

如果您堅持使用模糊的時鐘格式,在Java 9和更高版本中,您可以通過調用toHoursPart,toMinutesParttoSecondsPart來構建該字符串。

在您的示例數據中,我們從晚上8點下午5點後退,因此結果爲負數小時和分鐘,負兩個半小時。

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

見本code run live at IdeOne.com


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore