Anzeigen von Morgen-, Nachmittags-, Abend- und Nachtnachrichten basierend auf der Zeit in Java

Lesezeit: 1 Minute

Was ich versuche zu tun::

Nachricht anzeigen basierend auf

  • Guten Morgen (12-12 Uhr)
  • Gut nach Mittag (12:00-16:00)
  • Guten Abend (16:00 bis 21:00)
  • Gute Nacht (21:00 bis 06:00 Uhr)

CODE::

Ich habe das 24-Stunden-Format verwendet, um diese Logik zu erhalten

private void getTimeFromAndroid() {
        Date dt = new Date();
        int hours = dt.getHours();
        int min = dt.getMinutes();

        if(hours>=1 || hours<=12){
            Toast.makeText(this, "Good Morning", Toast.LENGTH_SHORT).show();
        }else if(hours>=12 || hours<=16){
            Toast.makeText(this, "Good Afternoon", Toast.LENGTH_SHORT).show();
        }else if(hours>=16 || hours<=21){
            Toast.makeText(this, "Good Evening", Toast.LENGTH_SHORT).show();
        }else if(hours>=21 || hours<=24){
            Toast.makeText(this, "Good Night", Toast.LENGTH_SHORT).show();
        }
    }

Frage:

  • Ist das der beste Weg, wenn nein, was ist der beste Weg?

  • @Devrath Off-Topic-Hinweis, sollte es nicht AND && sein, verwenden Sie OR || was wird dazu führen, dass alle Fälle (Stunden >= 1) in den Guten-Morgen-Fall fallen?

    – Jazan

    21. Dezember 2014 um 13:16 Uhr


  • Sie sollten wissen, dass die Stunden im Bereich dazwischen liegen 0 und 23: getHours().

    – Tom

    21. Dezember 2014 um 13:54 Uhr

  • @Devrath Ich habe die Antwort aktualisiert, um 12:59 zu berücksichtigen.

    – Benutzer987339

    21. Dezember 2014 um 14:07 Uhr

  • FYI, die lästigen Datum-Uhrzeit-Klassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormat sind jetzt Vermächtnis, ersetzt durch die java.time Klassen. Die meisten von den java.time Funktionalität ist in Java 6 & Java 7 zurückportiert ThreeTen-Backport Projekt. Weiter angepasst für frühere Android (<26) in ThreeTenABP. Sehen Wie benutzt man ThreeTenABP….

    – Basilikum Bourque

    12. Juni 2019 um 3:57 Uhr


Benutzer-Avatar
SMA

Sie sollten so etwas tun:

Calendar c = Calendar.getInstance();
int timeOfDay = c.get(Calendar.HOUR_OF_DAY);

if(timeOfDay >= 0 && timeOfDay < 12){
    Toast.makeText(this, "Good Morning", Toast.LENGTH_SHORT).show();        
}else if(timeOfDay >= 12 && timeOfDay < 16){
    Toast.makeText(this, "Good Afternoon", Toast.LENGTH_SHORT).show();
}else if(timeOfDay >= 16 && timeOfDay < 21){
    Toast.makeText(this, "Good Evening", Toast.LENGTH_SHORT).show();
}else if(timeOfDay >= 21 && timeOfDay < 24){
    Toast.makeText(this, "Good Night", Toast.LENGTH_SHORT).show();
}

  • Ich würde ein hinzufügen else Fall unten, um unerwartete Werte abzufangen (defensive Programmierung).

    – Basilikum Bourque

    21. Dezember 2014 um 18:49 Uhr


  • @BasilBourque Genau. Auch wenn es Ihr Support-Team über einen seltsamen Randfall informiert. Der Schlüssel ist, die App nicht zum Absturz zu bringen, da dies nicht unternehmenskritisch ist.

    – Joshua Pinter

    13. Mai 2017 um 19:52 Uhr

  • bekomme Instanz(); Benötige Android API 24.

    – Abed Putra

    4. August 2017 um 15:40 Uhr


  • FYI, die lästigen Datum-Uhrzeit-Klassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormat sind jetzt Vermächtnis, ersetzt durch die java.time Klassen. Die meisten von den java.time Funktionalität ist in Java 6 & Java 7 zurückportiert ThreeTen-Backport Projekt. Weiter angepasst für frühere Android (<26) in ThreeTenABP. Sehen Wie benutzt man ThreeTenABP….

    – Basilikum Bourque

    12. Juni 2019 um 3:58 Uhr

Benutzer-Avatar
Vishal Sonawane

Für alle, die das Neueste suchen Kotlin Syntax für die Antwort von @SMA, hier ist die Hilfsfunktion:

fun getGreetingMessage():String{
    val c = Calendar.getInstance()
    val timeOfDay = c.get(Calendar.HOUR_OF_DAY)

    return when (timeOfDay) {
           in 0..11 -> "Good Morning"
           in 12..15 -> "Good Afternoon"
           in 16..20 -> "Good Evening"
           in 21..23 -> "Good Night"
           else -> "Hello"
      }
    }

Benutzer-Avatar
Konstantin Jowkow

Ich würde deine kürzen if/elseif Erklärung an:

String greeting = null;
if(hours>=1 && hours<=12){
    greeting = "Good Morning";
} else if(hours>=12 && hours<=16){
    greeting = "Good Afternoon";
} else if(hours>=16 && hours<=21){
    greeting = "Good Evening";
} else if(hours>=21 && hours<=24){
    greeting = "Good Night";
}
Toast.makeText(this, greeting, Toast.LENGTH_SHORT).show();

  • [+1] zur Optimierung

    – Devrat

    21. Dezember 2014 um 13:55 Uhr

Benutzer-Avatar
Yoshua Nahar

java.time

Ich würde empfehlen, Java 8 LocalTime zu verwenden.

Erstellen Sie vielleicht eine Klasse wie diese, um Ihr Tageszeitproblem zu lösen.

public class GreetingMaker { // think of a better name then this.

  private static final LocalTime MORNING = LocalTime.of(0, 0, 0);
  private static final LocalTime AFTER_NOON = LocalTime.of(12, 0, 0);
  private static final LocalTime EVENING = LocalTime.of(16, 0, 0);
  private static final LocalTime NIGHT = LocalTime.of(21, 0, 0);

  private LocalTime now;

  public GreetingMaker(LocalTime now) {
    this.now = now;
  }

  public void printTimeOfDay() { // or return String in your case
    if (between(MORNING, AFTER_NOON)) {
      System.out.println("Good Morning");
    } else if (between(AFTER_NOON, EVENING)) {
      System.out.println("Good Afternoon");
    } else if (between(EVENING, NIGHT)) {
      System.out.println("Good Evening");
    } else {
      System.out.println("Good Night");
    }
  }

  private boolean between(LocalTime start, LocalTime end) {
    return (!now.isBefore(start)) && now.isBefore(end);
  }

}

Benutzer-Avatar
Benutzer987339

Sie bestimmen, ob es sich um das erste Intervall handelt, und alle anderen Intervalle hängen von der Obergrenze ab. So können Sie es noch kürzer machen:

String greeting = null;
if(hours>=1 && hours<=11){
    greeting = "Good Morning";
} else if(hours<=15){
    greeting = "Good Afternoon";
} else if(hours<=20){
    greeting = "Good Evening";
} else if(hours<=24){
    greeting = "Good Night";
}
Toast.makeText(this, greeting, Toast.LENGTH_SHORT).show();

  • Wollen Sie um 12:59 einen Guten Morgen oder Guten Tag? Sie müssen @Devrath testen, bevor Sie die Antwort akzeptieren.

    – SMA

    21. Dezember 2014 um 13:57 Uhr

  • @ almas shaikh …. kannst du deine Antwort zur Optimierung so bearbeiten user987339 empfohlen ? …….. @ [+1] zum user987339 zur Optimierung

    – Devrat

    21. Dezember 2014 um 13:59 Uhr

  • @almas sheikh du hattest recht. Ich habe die Antwort für den Fall von 12:59 aktualisiert

    – Benutzer987339

    21. Dezember 2014 um 14:06 Uhr

  • Nun, es ist nicht schön, dass ich dann keinen Gruß bekomme hours ist 0.

    – Tom

    21. Dezember 2014 um 14:10 Uhr

  • Bitte lesen Sie dies JavaDoc.

    – Tom

    21. Dezember 2014 um 14:16 Uhr

Benutzer-Avatar
Sagar G.

Probieren Sie diesen Code aus (Methoden zum Abrufen von Stunden und Abrufen von Minuten in der Date-Klasse sind veraltet.)

 private void getTimeFromAndroid() {
    Date dt = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(dt);
    int hours = c.get(Calendar.HOUR_OF_DAY);
    int min = c.get(Calendar.MINUTE);

    if(hours>=1 && hours<=12){
        Toast.makeText(this, "Good Morning", Toast.LENGTH_SHORT).show();
    }else if(hours>=12 && hours<=16){
        Toast.makeText(this, "Good Afternoon", Toast.LENGTH_SHORT).show();
    }else if(hours>=16 && hours<=21){
        Toast.makeText(this, "Good Evening", Toast.LENGTH_SHORT).show();
    }else if(hours>=21 && hours<=24){
        Toast.makeText(this, "Good Night", Toast.LENGTH_SHORT).show();
    }
}

  • Wollen Sie um 12:59 einen Guten Morgen oder Guten Tag? Sie müssen @Devrath testen, bevor Sie die Antwort akzeptieren.

    – SMA

    21. Dezember 2014 um 13:57 Uhr

  • @ almas shaikh …. kannst du deine Antwort zur Optimierung so bearbeiten user987339 empfohlen ? …….. @ [+1] zum user987339 zur Optimierung

    – Devrat

    21. Dezember 2014 um 13:59 Uhr

  • @almas sheikh du hattest recht. Ich habe die Antwort für den Fall von 12:59 aktualisiert

    – Benutzer987339

    21. Dezember 2014 um 14:06 Uhr

  • Nun, es ist nicht schön, dass ich dann keinen Gruß bekomme hours ist 0.

    – Tom

    21. Dezember 2014 um 14:10 Uhr

  • Bitte lesen Sie dies JavaDoc.

    – Tom

    21. Dezember 2014 um 14:16 Uhr

Benutzer-Avatar
Meno Hochschild

Verwenden Zeit4J (oder Time4A auf Android) ermöglicht folgende Lösungen, die keine if-else-Anweisungen benötigen:

ChronoFormatter<PlainTime> parser =
    ChronoFormatter.ofTimePattern("hh:mm a", PatternType.CLDR, Locale.ENGLISH);
PlainTime time = parser.parse("10:05 AM");

Map<PlainTime, String> table = new HashMap<>();
table.put(PlainTime.of(1), "Good Morning");
table.put(PlainTime.of(12), "Good Afternoon");
table.put(PlainTime.of(16), "Good Evening");
table.put(PlainTime.of(21), "Good Night");
ChronoFormatter<PlainTime> customPrinter=
    ChronoFormatter
      .setUp(PlainTime.axis(), Locale.ENGLISH)
      .addDayPeriod(table)
      .build();
System.out.println(customPrinter.format(time)); // Good Morning

Es gibt auch eine andere musterbasierte Methode, um das Gebietsschema standardmäßig basierend auf CLDR-Daten entscheiden zu lassen, wie die Uhrzeit formatiert werden soll:

ChronoFormatter<PlainTime> parser =
    ChronoFormatter.ofTimePattern("hh:mm a", PatternType.CLDR, Locale.ENGLISH);
PlainTime time = parser.parse("10:05 AM");

ChronoFormatter<PlainTime> printer1 =
    ChronoFormatter.ofTimePattern("hh:mm B", PatternType.CLDR, Locale.ENGLISH);
System.out.println(printer1.format(time)); // 10:05 in the morning

ChronoFormatter<PlainTime> printer2 =
    ChronoFormatter.ofTimePattern("B", PatternType.CLDR, Locale.ENGLISH)
        .with(Attributes.OUTPUT_CONTEXT, OutputContext.STANDALONE);
System.out.println(printer2.format(time)); // morning

Die einzige andere mir bekannte Bibliothek, die das auch kann (aber auf umständliche Weise), ist ICU4J.

1088690cookie-checkAnzeigen von Morgen-, Nachmittags-, Abend- und Nachtnachrichten basierend auf der Zeit in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy