• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Spigot Bei Zeitanzeige eine 1 dazu addieren

Appstun | Äppi

Minecrafter
Registriert
22 September 2020
Beiträge
23
Diamanten
300
Minecraft
Appstun
Hallo Internets,
ich wollte ein Inventar machen, das 1 Item die Zeit und das andere das Datum anzeigt.
Das Problem ist jetzt, dass Bukkit mit der Zeit zurück hängt, also wenn es in Deutschland zum Beispiel 12 Uhr ist, zeigt Bukkit 11 Uhr an. Wie kann ich auf die Stunde (h) 1 dazu addieren?

Realworldtime.java:
package de.appstun.tintcraft.commands;

import de.appstun.tintcraft.listeners.builder.ItemBuilder;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Realworldtime implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        Player p = (Player) sender;
        Inventory inv = Bukkit.createInventory(null, InventoryType.CHEST, "Zeit / Datum");
        Date now = new Date();
        SimpleDateFormat h = new SimpleDateFormat("hh");
        SimpleDateFormat m = new SimpleDateFormat("mm");
        SimpleDateFormat s = new SimpleDateFormat("ss");
        SimpleDateFormat date = new SimpleDateFormat("dd.MM.yyyy");
        inv.setItem(11, new ItemBuilder(Material.CLOCK).setDisplayname("§6Zeit: " + h.format(now) + ":" + m.format(now) + ":" + s.format(now)).build());
        inv.setItem(15, new ItemBuilder(Material.KNOWLEDGE_BOOK).setDisplayname("§6Datum: " + date.format(now)).build());
        p.openInventory(inv);
        return false;
    }
}

Irgendwo muss doch ein "+ 1" hin, oder?
Ich habe schon das an mehrere Stellen im Script getestet, aber immer wurde nur eine 1 an die Stunde (h) dran gehangen.
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Java 8 hat eine neue API für Zeitrechnungen bekommen. Ich kann dir nur drigend raten, diese zu nutzen, da sie dem alten Date deutlich überlegen ist. Das erkennt man auch schon daran, dass dir dieser Fehler mit der neuen API gar nicht passiert wäre.

Zeitrechnungen sind kompliziert und ein Computer kennt mehrere Möglichkeiten die aktuelle Zeit auszudrücken, wobei die erste Frage vermutlich überhaupt erstmal ist: Welche Zeit haben wir gerade? Je nach dem, wo du gerade bist, hast du nämlich eine andere Zeit. Wenn du also eine absolute Zeit brauchst, dann brauchst du nicht nur die Uhrzeit selbst, sondern auch die Zeitzone und ggf. existierende Regeln für Sommer oder Winterzeit.

Um es kurz zu machen: Du hast gerade nichts davon. Vermutlich läuft dein Server in UTC und Java übernimmt das einfach. Wenn du jetzt einfach nur 1 dazu addierst, dann musst du beim Wechsel auf Sommerzeit 2 Stunden dazu addieren.

Um das Konzept besser zu verstehen empfehle ich: https://www.baeldung.com/java-8-date-time-intro oder alternativ die API Docs.

Mit der Java 8 Time API sähe das dann so aus. Wichtig: Die Formatierer sind Performancelöcher, daher sollte man die nur einmal instanzieren und dann wiederverwenden.

Java:
// die hier natürlich direkt in die Klasse
public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("hh:mm:ss", Locale.GERMAN);
public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.GERMAN);

ZonedDateTime zoneNow = ZonedDateTime.now(TimeZone.getTimeZone("Europe/Berlin").toZoneId());
String time = TIME_FORMATTER.format(zoneNow);
String date = DATE_FORMATTER.format(zoneNow);
 
Oben