मैं (एक DATETIME प्रकार स्तंभ का) MySQL डेटाबेस में यूटीसी क्षेत्र में दिनांक/समय स्टोर करने के लिए की जरूरत है। जब कोई उपयोगकर्ता किसी दिनांक में प्रवेश करता है, तो इसे पहले जेएसएफ कनवर्टर द्वारा org.joda.time.DateTime
में परिवर्तित किया जाता है।यूटीसी जोन में दिनांक/समय को MyClQL में Joda-Time का उपयोग करके EclipseLink के माध्यम से कैसे सम्मिलित करें?
इस तारीख को MySQL डेटाबेस में डालने से पहले, इसे फिर से java.util.Date
में परिवर्तित करने की आवश्यकता है - EclipseLink के लिए धन्यवाद।
निम्नलिखित कनवर्टर है जो फिर से कनवर्टर्स org.joda.time.DateTime
से java.util.Date
हालांकि यह कनवर्टर देखने के लिए वास्तव में आवश्यक नहीं है।
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);
}
}
convertObjectValueToDataValue()
विधि में (पहले एक), पहली पैरामीटर का मान - objectValue
प्राप्त सही यूटीसी तिथि/समय एक JSF कनवर्टर में Joda समय से परिवर्तित है।
उदाहरण के लिए, यदि मैंने दिनांक - 02-Oct-2013 11:34:26 AM
दर्ज किया है, तो objectValue
का मान - 2013-10-02T06:04:26.000Z
होगा। यह दिनांक/समय डेटाबेस में डाला जाना चाहिए।
लेकिन जब यह मान इस अभिव्यक्ति द्वारा परिवर्तित किया जाता है - (DateTime) objectValue).withZone(DateTimeZone.UTC).toDate()
, यह फिर से 2013-10-02 11:34:26.0
का मूल्यांकन किया जाता है और यह मान डेटाबेस को प्रदान किया जाता है जो गलत है।
वैसे भी, कैसे (DateTime) objectValue).withZone(DateTimeZone.UTC).toDate()
को यूटीसी क्षेत्र सेट करना? इस प्रकार
प्रकार org.joda.time.DateTime
की संपत्ति एक मॉडल वर्ग में नामित किया गया है।
@Column(name = "discount_start_date", columnDefinition = "DATETIME")
@Converter(name = "dateTimeConverter", converterClass = JodaDateTimeConverter.class)
@Convert("dateTimeConverter")
private DateTime discountStartDate;
संपादित करें:(निम्नलिखित JSF कनवर्टर काम करता है EclipseLink कनवर्टर के साथ की उम्मीद के रूप में जो ऊपर बरकरार रहता है - अब तक BalusC से केवल answer से)
यह मेरा है जेएसएफ कनवर्टर। क्योंकि DateTime#toDate()
java.util.Date
के रूपांतरण के दौरान समय क्षेत्र का उपयोग नहीं करता
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;
}
}
यूटीएफ? शायद यूटीसी, टाइमस्टैम्प आमतौर पर यूटीसी में होता है, इसलिए समस्या केवल मिलिस से स्ट्रिंग के रूपांतरण के दौरान होती है, इस जांच के लिए http://stackoverflow.com/questions/7670355/convert-date-time-for-given-timezone-java , भी, उचित डेटाबेस टाइमज़ोन सेटिंग –
क्षमा करें यह यूटीसी - नींद टाइपिंग है। – Tiny
मैं 'कैलेंडर' ऑब्जेक्ट वापस नहीं कर सकता। जब डेटाबेस को डेटा प्रदान किया जाता है, तो उसे 'java.sql.Timestamp' वापस करना चाहिए। इस तरह जेपीए मैपिंग काम करते हैं। – Tiny