Search code examples
javamongodbdatetimedatetime-formatsimpledateformat

How can I retrieve datetiime from mongodb? By comparing the data with jDateChosser Java


private void showdataTable_btnActionPerformed(java.awt.event.ActionEvent evt) {                                                  
    try {
        DateFormat df = new SimpleDateFormat("YYYY-mm-dd'T'HH:MM:ss'Z'");  //set date format

        String set = df.format(dateChoos1.getDate());           //add value to set

        BasicDBObject whereQuery = new BasicDBObject();
        whereQuery.put("datetimes", set);                       //where date via set(date)

        DBCursor cursor = table.find(whereQuery);
        while (cursor.hasNext()) {
            DBObject obj = cursor.next();
            String ip_address = (String) obj.get("ip_address");
            String mac_address = (String) obj.get("mac_address");
            Date datetimes = (Date) obj.get("datetimes");
            String url = (String) obj.get("url");
            model.insertRow(model.getRowCount(), new Object[]{datetimes, ip_address, mac_address, url});
        }
    } catch (Exception e) {
        System.out.println("Something went wrong.");
    }
}

Solution

  • Your format, YYYY-mm-dd'T'HH:MM:ss'Z' is not correct. Let's discuss everything which is wrong with this format.

    1. You have used Y instead of y: The symbol Y is used for Week year while y is used for Year. Check Difference between year-of-era and week-based-year? to learn more about it.
    2. You have used mm for month: The correct symbol for the month is M.
    3. You have used MM for minutes: The correct symbol for the minute is m.
    4. You have enclosed Z within single quotes: The symbol, Z is used for Time zone whereas 'Z' is nothing but a character literal. Probably you want to format the timezone offset of +00:00 as Z and for this, you should in fact use X.

    So, the correct format is as follows:

    yyyy-MM-dd'T'HH:mm:ssX
    

    A demo with the suggested format:

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.ENGLISH);
            Calendar calendar = Calendar.getInstance();
            Date date = calendar.getTime();
            System.out.println(sdf.format(date));
        }
    }
    

    Output:

    2021-01-14T08:13:01Z
    

    Note that the date-time API of java.util and their formatting API, SimpleDateFormat are outdated and error-prone. It is recommended to stop using them completely and switch to the modern date-time API.

    Use Date#toInstant to convert a java.util.Date object (the legacy type) to java.time.Instant (the modern type). Instant represents an instantaneous point on the time-line and should be just enough for most of your JSON operations. The Instant#toString returns the date-time string with UTC timezone offset which is compliant with ISO-8601 standards.

    Demo:

    import java.time.Instant;
    import java.time.OffsetDateTime;
    import java.time.ZoneOffset;
    import java.time.format.DateTimeFormatter;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            Calendar calendar = Calendar.getInstance();
            Date date = calendar.getTime();
            Instant instant = date.toInstant();
            // Print the value of instant#toString
            System.out.println(instant);
    
            OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC);
            System.out.println(odt);
            // Custom format
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX", Locale.ENGLISH);
            System.out.println(dtf.format(odt));
        }
    }
    

    Output:

    2021-01-14T08:28:35.659Z
    2021-01-14T08:28:35.659Z
    2021-01-14T08:28:35Z