Wie füge ich Datum / Uhrzeit in der UTC-Zone mit Joda-Time über EclipseLink in MySQL ein?

Ich muss Datum / Uhrzeit in der UTC-Zone in der MySQL-Datenbank (einer Spalte vom Typ DATETIME) speichern. Wenn ein Benutzer ein Datum eingibt, wird es zuerst in konvertiertorg.joda.time.DateTime von einem JSF-Konverter.

Vor dem Einfügen dieses Datums in die MySQL-Datenbank muss es erneut in konvertiert werdenjava.util.Date - dank EclipseLink.

Das Folgende ist der Konverter, der wieder Konverterorg.joda.time.DateTime zujava.util.Date Allerdings ist es nicht wirklich nötig, diesen Konverter zu sehen.

package joda.converter;

import java.util.Date;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.sessions.Session;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

public final class JodaDateTimeConverter implements Converter
{
    private static final long serialVersionUID = 1L;

    @Override
    public Object convertObjectValueToDataValue(Object objectValue, Session session)
    {
        return objectValue instanceof DateTime?((DateTime) objectValue).withZone(DateTimeZone.UTC).toDate():null;
    }

    @Override
    public Object convertDataValueToObjectValue(Object dataValue, Session session)
    {
        return dataValue instanceof Date?new DateTime((Date) dataValue):null;
    }

    @Override
    public boolean isMutable()
    {
        return true;
    }

    @Override
    public void initialize(DatabaseMapping databaseMapping, Session session)
    {
        databaseMapping.getField().setType(java.util.Date.class);
    }
}

In demconvertObjectValueToDataValue() Methode (die erste), der Wert des ersten Parameters -objectValue Received ist das korrekte UTC-Datum / die korrekte UTC-Zeit, die von Joda-Time in einem JSF-Konverter konvertiert wurde.

Wenn ich zum Beispiel ein Datum eingegeben habe -02-Oct-2013 11:34:26 AM dann ist der Wert vonobjectValue wäre -2013-10-02T06:04:26.000Z. Dieses Datum und diese Uhrzeit sollten in die Datenbank eingefügt werden.

Aber wenn dieser Wert durch diesen Ausdruck konvertiert wird -(DateTime) objectValue).withZone(DateTimeZone.UTC).toDate()wird es wieder ausgewertet2013-10-02 11:34:26.0 und dieser Wert wird an die Datenbank übergeben, was falsch ist.

Wie auch immer, wie man die UTC-Zone auf einstellt(DateTime) objectValue).withZone(DateTimeZone.UTC).toDate()?

Eine Eigenschaft vom Typorg.joda.time.DateTime wird in einer Modellklasse wie folgt bezeichnet.

@Column(name = "discount_start_date", columnDefinition = "DATETIME")
@Converter(name = "dateTimeConverter", converterClass = JodaDateTimeConverter.class)
@Convert("dateTimeConverter")
private DateTime discountStartDate;

BEARBEITEN: (Der folgende JSF-Konverter funktioniert wie erwartet zusammen mit dem obigen EclipseLink-Konverter, der intakt bleibt - von dem einzigenAntworten bisher von BalusC)

Dies ist mein JSF-Konverter.

package converter;

import java.util.TimeZone;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import util.Utility;

@ManagedBean
@RequestScoped
public final class DateTimeConverter implements Converter
{
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        DateTime dateTime=null;

        try
        {
            dateTime = DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss aa").withZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone("IST"))).parseDateTime(value);
        }
        catch (IllegalArgumentException e)
        {
            throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", Utility.getMessage("datetime.converter.error", DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss aa").print(DateTime.now().withZone(DateTimeZone.forID("Asia/Kolkata"))))), e);
        }
        catch(UnsupportedOperationException e)
        {
            throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", Utility.getMessage("datetime.converter.error", DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss aa").print(DateTime.now().withZone(DateTimeZone.forID("Asia/Kolkata"))))), e);
        }
        return dateTime;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        DateTimeFormatter dateTimeFormatter=DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss aa").withZone(DateTimeZone.forID("Asia/Kolkata")); //This zone will be tackled/handled later from the database to display.              
        return value instanceof DateTime?dateTimeFormatter.print((DateTime)value):null;
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage