web-dev-qa-db-fra.com

Décalage horaire entre deux fois

Je veux afficher la différence entre deux fois au format hh: mm. 

La première fois provient d'une base de données et la deuxième fois correspond à l'heure système. Le décalage horaire est mis à jour chaque seconde.

Comment puis je faire ça?

Actuellement, j'utilise deux heures manuelles si cela fonctionne parfaitement, je les implémente dans mes applications.

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);
    }
}
17
Niks

Pour calculer la différence entre deux dates, vous pouvez essayer quelque chose comme: 

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

String diff = hours + ":" + mins; 

Pour mettre à jour le décalage horaire toutes les secondes, vous pouvez utiliser la minuterie.

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: Code de travail:

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);
    }
25
Sanober Malik

a finalement fait 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;
    }

}
6
Niks

Utiliser Java.time

La méthode moderne consiste à utiliser les classes Java.time qui supplantent les anciennes classes gênantes de date et d’heure.

La classe LocalTime représente une heure sans date ni fuseau horaire.

Définissez un modèle de formatage avec DateTimeFormatter class.

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

La classe LocalTime fonctionne dans une seule journée générique de 24 heures. Donc, il ne songe pas à traverser minuit. Si vous souhaitez passer d'un jour à l'autre, vous devriez plutôt utiliser ZonedDateTime, OffsetDateTime ou LocalDateTime, tous les objets date-heure plutôt que l'heure.

Un Duration capture une période de temps non attachée à la timeline.

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

L'appel toString génère du texte dans la norme ISO 8601format des durées : PnYnMnDTnHnMnS où la P marque le début et la T sépare les années, les mois, les jours et les heures, les minutes, les secondes. Je recommande fortement d'utiliser ce format plutôt que le format "HH: MM: SS" qui est ambigu avec clock-time.

Si vous insistez pour utiliser le format d'horloge ambigu, Java 9 et les versions ultérieures vous permettent de construire cette chaîne en appelant toHoursPart, toMinutesPart et toSecondsPart

Dans votre exemple de données, nous reculons dans le temps et sommes passés de 8 PM à 17 heures. Le résultat est donc un nombre d'heures et de minutes négatif, deux heures et demie négatives.

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

Voir ceci code exécuté en direct sur IdeOne.com .


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat .

Le projet Joda-Time , désormais en mode maintenance , conseille de migrer vers les classes Java.time .

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes Java.time? 

  • Java SE 8 et SE 9 et versions ultérieures
    • Intégré. 
    • Une partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval _, YearWeek , YearQuarter _ et plus _.

5
Basil Bourque

Le processus est à peu près comme suit,

  1. Convertissez votre instance de chaîne en instance de date de la manière suivante

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date date = format.parse("2011-01-03");
    
  2. En supposant que le temps système que vous avez est long, représentant des millisecondes depuis l’époc, vous pouvez maintenant effectuer les opérations suivantes:

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

    longNow est votre variable actuelle contenant l'heure du système. 

2
JustDanyul

OK, je construis ici Funcion pour vous:

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

RÉPONSE: 2: 15; dans le logcat

1
omri lugasi

Salut Les gars ne savent pas ce que je faisais mal, mais cela m'a aidé, j'espère pouvoir aider quelqu'un d'autre. 

Mes min ont été calculés dans un format float alors j'ai utilisé cette formule 

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

Bonne codage

0
DrDroid
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
Coldfin Lab