Timestamp zu Datum und umgekehrt

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

ich würde gerne zu Übungszwecken ein Programm schreiben, welches Timestamps zu Daten und andersrum berechnet.

Der User hat einen Frame mit 6 Textfeldern (Timestamp, Tag, Monat, Jahr, Stunde, Minute). Wenn er irgentwo was eingibt soll der Rest berechnet werden.

Das ganze habe ich schon für den Timestamp hinbekommen. Das Programm spuckt also nun alles andere aus wenn man den Timestamp eingibt (bzw wenn man nichts eingibt den aktuellen Stamp).

Bei dem Rest haperts noch. Ich habe mir die API's und Bücher durchgelesen, finde jedoch nichts wo ich von String zu Date umwandeln kann. Wie mache ich das?

Code:
package timestamp;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Main extends JFrame implements ActionListener {

    private Date date = new Date();
    private SimpleDateFormat format;
    
    private JTextField timestampField, dayField, monthField, yearField, hourField, minuteField;

    /**
     * Method thats updates all components to date.
     */
    private void updateComponents() {
        
        timestampField.setText("" + ( date.getTime() / 1000l ));
        
        format = new SimpleDateFormat("dd");
        dayField.setText(format.format(date));
        
        format = new SimpleDateFormat("MM");
        monthField.setText(format.format(date));
        
        format = new SimpleDateFormat("yyyy");
        yearField.setText(format.format(date));
        
        format = new SimpleDateFormat("kk");
        hourField.setText(format.format(date));
        
        format = new SimpleDateFormat("mm");
        minuteField.setText(format.format(date));
        
    }
    
    /**
     * ActionListener for timestampField
     */
    public void actionPerformed(ActionEvent e) {
    
        if( e.getSource() == timestampField ) {

            timestampField.setText(timestampField.getText().trim());
        
            if( timestampField.getText().equals("") ) timestampField.setText("" + (date.getTime() / 1000l) );
        
            try {
                date.setTime( Long.parseLong(timestampField.getText()) * 1000l );
                updateComponents();             
            }
            catch(Exception ex) {
                JOptionPane.showMessageDialog(
                        this,
                        "enterValidValueFor",
                        "error",
                        JOptionPane.ERROR_MESSAGE);
            }
            
        }
        
    }     
    
    /**
     * Frame.
     */
    public Main() {
        super("Fenstertitel");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel pane = new JPanel();  
        timestampField.addActionListener(this); 
        dayField.addActionListener(this); 
        monthField.addActionListener(this); 
        yearField.addActionListener(this); 
        hourField.addActionListener(this); 
        minuteField.addActionListener(this); 
        pane.add(timestampField);
        pane.add(dayField);
        pane.add(monthField);
        pane.add(yearField);
        pane.add(hourField);
        pane.add(minuteField);
        add(pane);
    }

    public static void main(String[] args) {
        Main ausgabe = new Main();
        ausgabe.setVisible(true);
    }
    
}
 
Sorry, ich hatte noch das pack() und vordefinieren vergessen:

Code:
package timestamp;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Main extends JFrame implements ActionListener {

    private Date date = new Date();
    private SimpleDateFormat format;
    
    private JTextField timestampField = new JTextField(5),
                       dayField       = new JTextField(5),
                       monthField     = new JTextField(5),
                       yearField      = new JTextField(5),
                       hourField      = new JTextField(5),
                       minuteField    = new JTextField(5);

    /**
     * Method thats updates all components to date.
     */
    private void updateComponents() {
        
        timestampField.setText("" + ( date.getTime() / 1000l ));
        
        format = new SimpleDateFormat("dd");
        dayField.setText(format.format(date));
        
        format = new SimpleDateFormat("MM");
        monthField.setText(format.format(date));
        
        format = new SimpleDateFormat("yyyy");
        yearField.setText(format.format(date));
        
        format = new SimpleDateFormat("kk");
        hourField.setText(format.format(date));
        
        format = new SimpleDateFormat("mm");
        minuteField.setText(format.format(date));
        
    }
    
    /**
     * ActionListener for timestampField
     */
    public void actionPerformed(ActionEvent e) {
    
        if( e.getSource() == timestampField ) {

            timestampField.setText(timestampField.getText().trim());
        
            if( timestampField.getText().equals("") ) timestampField.setText("" + (date.getTime() / 1000l) );
        
            try {
                date.setTime( Long.parseLong(timestampField.getText()) * 1000l );
                updateComponents();             
            }
            catch(Exception ex) {
                JOptionPane.showMessageDialog(
                        this,
                        "enterValidValueFor",
                        "error",
                        JOptionPane.ERROR_MESSAGE);
            }
            
        }
        
    }     
    
    /**
     * Frame.
     */
    public Main() {
        super("Fenstertitel");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pane = new JPanel();  
        timestampField.addActionListener(this); 
        dayField.addActionListener(this); 
        monthField.addActionListener(this); 
        yearField.addActionListener(this); 
        hourField.addActionListener(this); 
        minuteField.addActionListener(this); 
        pane.add(timestampField);
        pane.add(dayField);
        pane.add(monthField);
        pane.add(yearField);
        pane.add(hourField);
        pane.add(minuteField);
        add(pane);
        pack();
    }

    public static void main(String[] args) {
        Main ausgabe = new Main();
        ausgabe.setVisible(true);
    }
    
}
 
recht ähnlich
Date date = format .parse(string);

wenn alle Felder befüllt sind, dann ist es gut machbar,
füge die Teilstrings zusammen und benutze ein passendes Format

wenn du nur 10 Minuten hast, was dann?
 
Naja wenn der User nur ein Kästchen eingibt dann wird der Rest durch das aktuelle Datum ersetzt, aber du hast recht, was wenn der User einen Zeitpunkt vor der Unix-Zeit angibt? ???:L

Date date = format .parse(string);

wenn alle Felder befüllt sind, dann ist es gut machbar,
füge die Teilstrings zusammen und benutze ein passendes Format

also mache ich einfach tagFeld.getText() + "." + monatFeld.getText()... ? Muss ich vorher noch mit nullen auffüllen? Also wenn ich beim format dd hab aber der User beim Tag nur 2 angegeben hat.

Danke für deine Hilfe
 
das wirst du herausfinden, nachdem du das Wort 'Ausprobieren' nachgeschlagen hast 😉
'API/ Lehrbuch lesen' gibts auch noch, aber bei so einem schweren Thema auch nur schwer zu finden

leichter ist in dem 'aktuelles Datum'-Fall vielleicht, die nichtleeren Felder in Zahlen zu parsen und Calendar zu verwenden

aktueller Calendar,
calendar.set(YEAR, year);
usw.
(siehe API/ Lehrbuch/ google/ Forumsuche für tatsächliche Bedienung)
 
Okay danke, ich habs. Wen die Lösung interressiert hier die Source der Methoden (timestamp = SimTimeT):

Code:
    private Date date = new Date();
    private SimpleDateFormat format;
        
    /**
     * Method thats updates all components to date.
     */
    private void updateComponents() {
        
        simTimeTField.setText("" + ( date.getTime() / 1000l ));
        
        format = new SimpleDateFormat("dd");
        dayField.setText(format.format(date));
        
        format = new SimpleDateFormat("MM");
        monthField.setText(format.format(date));
        
        format = new SimpleDateFormat("yyyy");
        yearField.setText(format.format(date));
        
        format = new SimpleDateFormat("kk");
        hourField.setText(format.format(date));
        
        format = new SimpleDateFormat("mm");
        minuteField.setText(format.format(date));
        
    }

    private void resetButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            

        date = new Date();
        updateComponents();         
        
    }                                           

    private void FieldActionPerformed(java.awt.event.ActionEvent evt) {                                      

        dayField.setText   (dayField.getText().trim()   );
        monthField.setText (monthField.getText().trim() );
        yearField.setText  (yearField.getText().trim()  );
        hourField.setText  (hourField.getText().trim()  );
        minuteField.setText(minuteField.getText().trim());
        
        if( dayField.getText().equals("") ) {
            format = new SimpleDateFormat("dd");
            dayField.setText("" + format.format(date) );
        }
        
        if( monthField.getText().equals("") ) {
            format = new SimpleDateFormat("MM");
            monthField.setText("" + format.format(date) );
        }
        
        if( yearField.getText().equals("") ) {
            format = new SimpleDateFormat("yyyy");
            yearField.setText("" + format.format(date) );
        }
        
        if( hourField.getText().equals("") ) {
            format = new SimpleDateFormat("kk");
            hourField.setText("" + format.format(date) );
        }
        
        if( minuteField.getText().equals("") ) {
            format = new SimpleDateFormat("mm");
            minuteField.setText("" + format.format(date) );
        }
        
        try {
            
            int iday, imonth, iyear, ihour, iminute;
            
            iday    = Integer.parseInt(dayField.getText()   );
            imonth  = Integer.parseInt(monthField.getText() );
            iyear   = Integer.parseInt(yearField.getText()  );
            ihour   = Integer.parseInt(hourField.getText()  );
            iminute = Integer.parseInt(minuteField.getText());
            
            format = new SimpleDateFormat("dd.MM.yyy kk:mm");
            date = format.parse(iday + "." + imonth + "." + iyear + " " + ihour + ":" + iminute);
            
            updateComponents();             
        }
        catch(Exception e) {
            JOptionPane.showMessageDialog(
                    this,
                    Main.langGet("enterValidValueFor") + " " + Main.langGet("date"),
                    Main.langGet("error"),
                    JOptionPane.ERROR_MESSAGE);
        }
        
    }                                     

    private void simTimeTFieldActionPerformed(java.awt.event.ActionEvent evt) {                                              

        simTimeTField.setText(simTimeTField.getText().trim());
        
        if( simTimeTField.getText().equals("") ) simTimeTField.setText("" + (date.getTime() / 1000l) );
        
        try {
            date.setTime( Long.parseLong(simTimeTField.getText()) * 1000l );
            updateComponents();             
        }
        catch(Exception e) {
            JOptionPane.showMessageDialog(
                    this,
                    Main.langGet("enterValidValueFor") + " SimTimeT",
                    Main.langGet("error"),
                    JOptionPane.ERROR_MESSAGE);
        }
        
    }
 
wieso parst du den Inhalt der Textfelder in Zahlen,
z.B.
iday = Integer.parseInt(dayField.getText() );

und fügst die Zahlen dann wieder zu einem String zusammen?
verwende doch direkt die Strings aus den Textfeldern!


---------


allgemeiner Tipp:
auf alle Ewigkeit ständig neue SimpleDateFormat-Objekte zu erzeugen
könnte man als unnötig ansehen,
definiere dir 6 statische Variablen, dann hast du sie
 
Hey,

danke für den zweiten Tipp.. Wird gemacht 😀

Zum ersten Hinweis:

damit ich verhindern kann das der User zb Buchstaben eingibt
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben