2013-03-12 6 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

+0

Какова величина разницы (секунды, миллисекунды, дни ...)? – assylias

+3

Вы уже что-то пробовали? – Egor

ответ

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 

Edit: Рабочий код:

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

+0

здесь будет выполняться каждый раз, поэтому все, что вы хотите обновить или рассчитать, вы можете написать внутри него. –

+0

его не работает :( – Niks

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

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

ОК Я Строить здесь несильно для вас:

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(); 

Happy кодирования

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 -го дня. Поэтому он не рассматривает переход на полночь. Если вы хотите перекрещиваться между днями, вы должны использовать ZonedDateTime, OffsetDateTime или LocalDateTime вместо всех объектов времени, а не только по времени суток.

A Duration фиксирует промежуток времени, не привязанный к временной шкале.

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

Вызов toString генерирует текст в стандартном ISO 8601format for durations: PnYnMnDTnHnMnS где P отмечает начало и T разделяющих года-месяцы-дни от часов-минут-секунд. Я настоятельно рекомендую использовать этот формат, а не формат «HH: MM: SS», который неоднозначен с часами.

Если вы настаиваете на использовании двусмысленного формата времени-часов, в Java 9 и более поздних версиях вы можете построить эту строку, позвонив toHoursPart, toMinutesPart и toSecondsPart.

В данных примера мы движемся назад во времени, начиная с 8 вечера до 5 часов вечера, поэтому результат - отрицательное количество часов и минут, отрицательное два с половиной часа.

d.toString(): ПТ-2Н-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. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.

Смежные вопросы