Erste Schritte Timestamp DB

Errorfield

Mitglied
Hallo liebe Java Freunde,

ich hab folgendes Problem und vielleicht könnt ihr mir weiterhelfen bitte.

Es soll möglich sein, sich ein und auszubuchen in meinem Programm.

Ich speichere momentan auf einer Datenbank SQL einen Timestamp(2016-05-10 08:24:17) und möchte diesen dann in Java gegen die momentane Zeit gegenrechnen.

Und ihn dann via GUI an einem Button ausgeben lassen.

Jedoch komme ich nicht weiter.

Vielen Dank im Voraus.

Lg Susi

Java:
public class Login {

    public static boolean authenticate(String username, String password) throws SQLException {

        int dBUserID = 0;
        String dBpassword = "";
        String dBusername = "";
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {

            con = DBConnection.getDBConnection();
            ps = con.prepareStatement("SELECT * FROM Userdates WHERE username = ?  and password = ?");

            // (2) create a java timestamp object that represents the current
            // time (i.e., a "current timestamp")

            Calendar calendar = Calendar.getInstance();
            java.sql.Timestamp ourJavaTimestampObject = new java.sql.Timestamp(calendar.getTime().getTime());

            // (4) execute the sql timestamp insert statement

           

            ps.setString(1, username);
            ps.setString(2, password);

            rs = ps.executeQuery();
            if (rs.next()) {
                dBUserID = rs.getInt("UserID");
                dBusername = rs.getString("username");
                dBpassword = rs.getString("password");
            }
            // (3) create our java timestamp insert statement
           
            String sqlTimestampInsert = "INSERT INTO Timedates (StartTime,UserID) VALUES (?,?)";
            PreparedStatement ps2 = con.prepareStatement(sqlTimestampInsert);
            ps2.setTimestamp(1, ourJavaTimestampObject);
            ps2.setInt(2,dBUserID);
            ps2.execute();
       
        } catch (Exception e) {
            e.printStackTrace();
        }


        if
       
   

        (username.equals(dBusername) && password.equals(dBpassword)) {
            return true;
        }
       
        return false;
       

    }
}


Java:
public class LoginDialog extends JDialog {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private JTextField tfUsername;
    private JPasswordField pfPassword;
    private JLabel lbUsername;
    private JLabel lbPassword;
    private JButton btnLogin;
    private JButton btnCancel;
    //private JButton btnLockout;
    // private JButton btnCheckin;
    // private JButton btnCheckout;
    private boolean succeeded;

    public LoginDialog(Frame parent) {
        super(parent, "Login", true);
       
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints cs = new GridBagConstraints();

        cs.fill = GridBagConstraints.HORIZONTAL;

        lbUsername = new JLabel("Benutzername: ");
        cs.gridx = 0;
        cs.gridy = 0;
        cs.gridwidth = 1;
        panel.add(lbUsername, cs);

        tfUsername = new JTextField(20);
        cs.gridx = 1;
        cs.gridy = 0;
        cs.gridwidth = 2;
        panel.add(tfUsername, cs);

        lbPassword = new JLabel("Passwort: ");
        cs.gridx = 0;
        cs.gridy = 1;
        cs.gridwidth = 1;
        panel.add(lbPassword, cs);

        pfPassword = new JPasswordField(20);
        cs.gridx = 1;
        cs.gridy = 1;
        cs.gridwidth = 2;
        panel.add(pfPassword, cs);
        panel.setBorder(new LineBorder(Color.BLUE));

        btnLogin = new JButton("Anmelden");
        btnLogin.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {

                    if (Login.authenticate(getUsername(), getPassword())) {
                        JOptionPane.showMessageDialog(LoginDialog.this,
                                "Hallo " + getUsername() + "! Sie haben sich Erfolgreich angemeldet.", "Anmeldevorgang",
                                JOptionPane.INFORMATION_MESSAGE);
                        succeeded = true;
                        dispose();
                    } else {
                        JOptionPane.showMessageDialog(LoginDialog.this, "Falscher Benutzername oder Passwort",
                                "Anmeldevorgang", JOptionPane.ERROR_MESSAGE);

                        tfUsername.setText("");
                        pfPassword.setText("");
                        succeeded = false;

                    }
                } catch (HeadlessException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();

                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
       
       

        btnCancel = new JButton("Cancel");
        btnCancel.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
       
       
        JPanel bp = new JPanel();
       
       
        bp.add(btnLogin);
        bp.add(btnCancel);
       
       
        getContentPane().add(bp, BorderLayout.NORTH);
        getContentPane().add(panel, BorderLayout.CENTER);
        getContentPane().add(bp, BorderLayout.PAGE_END);
       
       
        pack();
        setResizable(false);
        setLocationRelativeTo(parent);
    }

    public String getUsername() {
        return tfUsername.getText().trim();
    }

    public String getPassword() {
        return new String(pfPassword.getPassword());
    }

    public boolean isSucceeded() {
        return succeeded;
    }
}

Java:
public class Main {
    public static void main(String[] args) {

   
        final JButton btnLockout = new JButton("Ausloggen");
        final JButton btnLastdays = new JButton("Letzten Tage");
        final JButton btnCheckout = new JButton("Ausbuchen");
        final JButton btnCheckin = new JButton("Einbuchen");
        final JButton btnLogin = new JButton("Anmelden!");
        final JFrame frame = new JFrame("Check in Time");

        btnLogin.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                LoginDialog loginDlg = new LoginDialog(frame);
               
               
                loginDlg.setVisible(true);
           

                if (loginDlg.isSucceeded()) {
                    btnLogin.setText("Wechseln");
                }
            }
        });

   
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 180);
        frame.setLayout(new FlowLayout());
        frame.getContentPane().add(btnLogin);
        frame.setVisible(true);
        frame.getContentPane().add(btnLockout, BorderLayout.CENTER);
        frame.getContentPane().add(btnCheckin, BorderLayout.CENTER);
        frame.getContentPane().add(btnCheckout, BorderLayout.CENTER);
        frame.getContentPane().add(btnLastdays, BorderLayout.CENTER);
        btnCheckin.setPreferredSize(new Dimension(130, 25));
        btnCheckout.setPreferredSize(new Dimension(130, 25));
        btnLogin.setPreferredSize(new Dimension(130, 25));
        btnLastdays.setPreferredSize(new Dimension(130, 25));
        btnLockout.setPreferredSize(new Dimension(130, 25));
    }
}
 

Errorfield

Mitglied
Respekt erstmal für die super schnelle Antwort!

Also im großen und ganzen soll es möglich sein für Person "X" das wenn sie sich mit richtigen Daten anmeldet, der Timestamp gespeichert wird, was ja funktioniert.
nun möchte ich in diesem Frame den Ausloggen Button die Funktion geben das er sich den Wert aus der DB zieht und ihn gegen die momentane zeit gegen rechnet.

Java:
System.currentTimeMillis();
                    System.out.println(System.currentTimeMillis());

sowas in der art?

welches Statement benutze ich nun um dies beides zu kombinieren?

lg Susi
 

Errorfield

Mitglied
Genau richtig die Dauer wie lange der User eingeloggt war.

vielleicht ein kleines Code beispiel?

soweit bin ich nun, bekomme das heutige Datum und die Milis aus den beiden Strings(Start+END).

Jedoch versuche ich die abfrage auf die reihe zu bekommen. ich möchte die abfrage irgendwie anders verpacken.

Wo jetzt Start und End als String hinterliegt, möchte ich gerne das Statement verfassen wie nur?

Java:
public class date {

            public static void main(String[] args) {
               
               
               
                String dateStart = "01/14/2016 15:29:58";
                String dateStop = "01/15/2016 10:31:48";
               
                //java.sql.Date date = new java.sql.Date(Calendar.getInstance().getTime().getTime());
               
                //HH converts hour in 24 hours format (0-23), day calculation
               
                Date zeitstempel = new Date();
               
                Date d1 = null;
                Date d2 = null;
                Connection con = null;
                PreparedStatement ps = null;
                ResultSet rs = null;
               
                try {
                   
                    con = DBConnection.getDBConnection();
                    ps = con.prepareStatement("SELECT StartTime, UserID FROM Timedates WHERE 1");
                   
                    SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");

                    System.out.println("Datum: " + format.format(zeitstempel));
                   
                   
                   
                    d1 = format.parse(dateStart);
                    d2 = format.parse(dateStop);

                    //in milliseconds
                    long diff = d2.getTime() - d1.getTime();

                    long diffSeconds = diff / 1000 % 60;
                    long diffMinutes = diff / (60 * 1000) % 60;
                    long diffHours = diff / (60 * 60 * 1000) % 24;
                    long diffDays = diff / (24 * 60 * 60 * 1000);

                    System.out.print(diffDays + " days, ");
                    System.out.print(diffHours + " hours, ");
                    System.out.print(diffMinutes + " minutes, ");
                    System.out.print(diffSeconds + " seconds.");
                   
                    Timestamp s = new Timestamp(System.currentTimeMillis());
                    DateFormat f= new SimpleDateFormat("dd.mm.yy - hh:mm");
                    System.out.println(f.format(new Date(s.getTime())));
                   
               
                    rs = ps.executeQuery();
                   
                   
                   
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

        }
 

Thallius

Top Contributor
Benutze am besten jodaTime oder noch besser wenn du Java 8 zur Verfügung hast LocalDateTime. Damit ist das super einfach

Code:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.0"); 
LocalDateTime start = LocalDateTime.parse(startSQL, formatter);
LocalDateTime end = LocalDateTime.parse(endSQL, formatter);
Duration duration = Duration.between(start, end);
System.out.println(duration.toMinutes);

Gruß

Claus
 

Errorfield

Mitglied
Ich habe Java 8 zur Verfügung, und danke für die Anregung.

Ich versuche nochmal das genauere Problem zu erklären,

1. Möglichkeit;

Zeitstempel speichern wenn man sich einloggt, und beim ausloggen noch einen Eintrag in die DB und dann diese beide ausrechnen?

2. Möglichkeit;
Ersten Login Zeitstempel gegen die dann herrschende Uhrzeit wenn sich der User ausloggt gegen rechnen.

Zeiten umformen und ausgeben habe ich alles hinbekommen, es fehlt das Magische Statement was in den Actionlistener Button(ausloggen) reinkommt.

Das Ergebnis soll die Die Dauer wie lange der User eingeloggt war darstellen.

lg Susi
 

thet1983

Top Contributor
ahh du willst das sql statement für die diff der zeiten...

Code:
SELECT
      TIMESTAMPDIFF(MINUTE,<columnStart>,<columnEnd>)
FROM
     <dbName>.<tableName>
WHERE
     id = <id>;

Edit: MySQL Statement
 

Errorfield

Mitglied
Java:
public class Login {

    public static boolean authenticate(String username, String password) throws SQLException {

        int dBUserID = 0;
        String dBpassword = "";
        String dBusername = "";
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        ResultSet rs2 = null;
        try {

            con = DBConnection.getDBConnection();
            ps = con.prepareStatement("SELECT * FROM Userdates WHERE username = ?  and password = ?");
          
          
            //long startTime = System.currentTimeMillis();
          
            //long estimatedTime = System.currentTimeMillis() - startTime;
          
            //System.out.println(startTime + estimatedTime);
          
            //Timestamp s = new Timestamp(System.currentTimeMillis());
            //DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          
            //System.out.println(f.format(new Date(s.getTime())));
          
  
            // (2) create a java timestamp object that represents the current
            // time (i.e., a "current timestamp")

            Calendar calendar = Calendar.getInstance();
            java.sql.Time ourJavaTimeObject = new java.sql.Time(calendar.getTime().getTime());
          
            // (4) execute the sql time insert statement

          
            ps.setString(1, username);
            ps.setString(2, password);

            rs = ps.executeQuery();
            if (rs.next()) {
                dBUserID = rs.getInt("UserID");
                dBusername = rs.getString("username");
                dBpassword = rs.getString("password");
            }
            // (3) create our java times insert statement
          
            String sqlTimeInsert = "INSERT INTO Timedates (StartTime,UserID,DateTime) VALUES (?,?,CURDATE())";
          
            String sqldatetime = "SELECT CURTIME() - StartTime FROM Timedates WHERE UserID = ? AND DateTime = CURDATE()";
          
            PreparedStatement ps2 = con.prepareStatement(sqlTimeInsert);
            PreparedStatement ps3 = con.prepareStatement(sqldatetime);
          
          
      
            ps2.setTime(1, ourJavaTimeObject);
            ps2.setInt(2,dBUserID);
            //ps2.execute();
            //ps2.executeQuery(sqldatetime);
            ps3.setInt(1,dBUserID);
            ps3.execute();
          
          
          
            rs2 = ps3.executeQuery();
          
            long millis =0;
            while (rs2.next()){
                  
            millis = rs2.getLong(1);
          
            //System.out.println(millis % (60 * 60 * 1000)/(60 * 1000));
            }
          
          
          
                      
            DecimalFormat format = new DecimalFormat("00");
            long day = millis/(24 * 60 * 60 * 1000);
            long hour = (millis % (24 * 60 * 60 * 1000))/(60 * 60 * 1000);
            long min = (millis % (60 * 60 * 1000))/(60 * 1000);
                      
            String p = "Tage:" + format.format(day)+ " Stunden:" + format.format(hour)+ " Minuten:" + format.format(min);
            String s2= "Tage:"+day + " Stunden:"+hour+" Minuten:"+min;
            System.out.println(p); //Ausgabe: Tage:00 Stunden:00 Minuten:00
            System.out.println(s2); //Ausgabe: Tage:0 Stunden:0 Minuten:0
                      
            DateFormat formatter = new SimpleDateFormat("dd 'Tage' HH 'Stunden und' mm 'Minuten'");
            System.out.println(formatter.format(new Date(millis))); //Ausgabe: 01 Tage 00 Stunden und 00 Minuten
                      
          
            //ps.close();
            //con.close();
          
          
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Check Username and Password

        if

        (username.equals(dBusername) && password.equals(dBpassword)) {
          
          
          
          
            return true;
      
        }
      
        return false;
        // ps.close();

    }
}

pure Verzweiflung herrscht bei mir :/ immer noch nicht das richtige Endergebnis!!!
 

mrBrown

Super-Moderator
Mitarbeiter
Was du da grad machst, ist die aktuelle Zeit in der DB speichern und dann von der aktuellen Zeit die grad gespeicherte (=aktuelle Zeit) abziehen, da kann ja auch nichts sinnvolles bei rumkommen ;)

Muss du überhaupt die Zeit in der DB speichern? Beim einloggen einmal Instant.now(), in der Session speichern, und beim ausloggen mithilfe von Duration die Zeit zwischen dem hinterlegtem und dem aktuellem Zeitpunkt berechnen ;)
 

Errorfield

Mitglied
Hallo mrBrown, nein ich muss nicht die zeit unbedingt in der DB speichern, am Anfang galt die DB nur zu Verifizierung der Userdates. dachte dort Zeitstempel hinterlegen einloggen+ausloggen wäre so leicht.

hättest du ein paar Code schnipsel rumfliegen zur Veranschaulichung?
deine Idee klingt logisch würde sie gerne umsetzten um weitere graue haare zu vermeiden :D
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
Instant start = Instant.now();
//irgendwo zwischenspeichern, gibt doch bestimmt irgendein User-Objekt...


Instant now = Instant.now();
Duration loggedIn = Duration.between(start, now);
//irgendwas mit der Dauer anstellen
 

Errorfield

Mitglied
Nachdem ich alle nochmal überdacht habe, bleibe ich wohl doch dabei die Zeit aus der Datenbank auszulesen und gegen rechnen zu lassen.

Bekomme nun auch soweit Werte zurück.

Jedoch will mein "JBUTTON" nicht das gewünschte Ergebnis geben?
Java:
btnCheckout.setText("Ausbuchen");
        btnCheckout.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               
               
                try {

                    Connection con = DBConnection.getDBConnection();
                    String sqldatetime = "SELECT CURTIME() - StartTime FROM Timedates WHERE UserID = ? AND DateTime = CURDATE()";
                    PreparedStatement ps3;
                    ResultSet rs2;
                    long millis = 0;
                    int dBUserID = 0;
                   
                    ps3 = con.prepareStatement(sqldatetime);
                   
                    ps3.setInt(1, dBUserID);
                   
               
                    ps3.execute();
                   
                   
                    rs2 = ps3.executeQuery();
                   
                   
                    while(rs2.next()) {
                   
                    
                    millis = rs2.getLong(1);
                   
                        System.out.println(millis);
                       

                    }
                } catch (Exception e3) {
                    e3.printStackTrace();

                }
            }
        });
    }
}
 

Errorfield

Mitglied
Leider gar keins, als würde irgendwas fehlen,

das komische ist wenn ich die Funktion außerhalb von dem Button ausprobiere gibt sie mir das "51066 Millisekunden" Ergebnis zurück.
 

Errorfield

Mitglied
Ich habe mich doch dann für den einfachen weg entschieden, den UnixTimestamp in einen "BIGINT" auf DB schreiben zu lassen,

Auf der DB wird dieser wert gespeichert.

146407317

Realzeit: 24.05.2016 - 08:59:39


Das letzte problem was ich nun habe, das ich es noch in dem System.out.print ausrechnen lassen möchte.

Java:
btnCheckout.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              
                try {
                    Connection con = DBConnection.getDBConnection();
                    String sqldatetime = "SELECT UNIX_TIMESTAMP() - StartTime FROM Timedates WHERE TimeID = 149 AND DateTime = CURDATE()";
                    PreparedStatement ps3;
                    ResultSet rs2;
                    long millis =0;
                    int dBUserID =1;
                  
                    ps3 = con.prepareStatement(sqldatetime);

                    rs2 = ps3.executeQuery();
                  
                  
                    if(rs2.next()) { 
                            millis = rs2.getLong(1);                        
                            //System.out.println(millis);<<<<< ????????
                    }
                } catch (Exception e3) {
                    e3.printStackTrace();
                }
              
            }
        });
    }
}


Dankeschön für die ganzen antworten und Hilfen weiß ich zu schätzen.!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Timestamp lesen Java Basics - Anfänger-Themen 6
P "Datestamp" to Date oder Timestamp Java Basics - Anfänger-Themen 15
F Timestamp auf volle Einheit abrunden Java Basics - Anfänger-Themen 9
M Methoden Aus Timestamp das Datum berechnen Java Basics - Anfänger-Themen 3
B Wie aus einem Datum String eine Timestamp erzeugen Java Basics - Anfänger-Themen 6
J TimeStamp Java Basics - Anfänger-Themen 5
Y Datei auf Dektop mit timestamp Speichern Java Basics - Anfänger-Themen 5
D Timestamp -> Datum Java Basics - Anfänger-Themen 6
E Timestamp umwandeln in Datumsangabe Java Basics - Anfänger-Themen 2
Assassin Timestamp erzeugen.. Java Basics - Anfänger-Themen 7
G String in Timestamp? Java Basics - Anfänger-Themen 2
J MySQL Timestamp "lesbarer" gestalten Java Basics - Anfänger-Themen 6
G Unterschied zwischen SQL Timestamp und Java Java Basics - Anfänger-Themen 2
G Timestamp in Minuten umrechnen Java Basics - Anfänger-Themen 8
M log4j Unterverzeichnis mit Datum , Timestamp in LogDateiname Java Basics - Anfänger-Themen 2
J aktuellen Timestamp ziehen Java Basics - Anfänger-Themen 3
G Timestamp - Timestamp Java Basics - Anfänger-Themen 8
G Timestamp zu Datum und umgekehrt Java Basics - Anfänger-Themen 7
G Timestamp zu Stunde:Minute Java Basics - Anfänger-Themen 2
A Timestamp nach Datum - Datum nach Timestamo Problem ! Java Basics - Anfänger-Themen 2
M Doppelte Einträge in einer datei löschen(nach timestamp)! Java Basics - Anfänger-Themen 4
P Timestamp zu Datum machen Java Basics - Anfänger-Themen 4
J gregorian calender zu java.sql.timestamp problem Java Basics - Anfänger-Themen 3
S Timestamp in Url Java Basics - Anfänger-Themen 13
M Zeitzonen unabhängigen Timestamp in DB speichern Java Basics - Anfänger-Themen 7
S String in Unix Timestamp Java Basics - Anfänger-Themen 11
G Timestamp mal wieder Java Basics - Anfänger-Themen 2
J timestamp Java Basics - Anfänger-Themen 7
W Datum to TimeStamp in Millis Java Basics - Anfänger-Themen 7
S Unix Timestamp entschlüssen Java Basics - Anfänger-Themen 6
H Text in Timestamp umwandeln Java Basics - Anfänger-Themen 3
Z TimeStamp aus MySQL DB umwandeln? Java Basics - Anfänger-Themen 2
S Datum in Unix-Timestamp umwandeln Java Basics - Anfänger-Themen 5
G Update auf Datenbankspalte vom Typ Timestamp mit aktu. Datum Java Basics - Anfänger-Themen 3
A Timestamp Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben