2013-10-14 5 views
5

मैं (एक 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; 
    } 
} 
+0

यूटीएफ? शायद यूटीसी, टाइमस्टैम्प आमतौर पर यूटीसी में होता है, इसलिए समस्या केवल मिलिस से स्ट्रिंग के रूपांतरण के दौरान होती है, इस जांच के लिए http://stackoverflow.com/questions/7670355/convert-date-time-for-given-timezone-java , भी, उचित डेटाबेस टाइमज़ोन सेटिंग –

+0

क्षमा करें यह यूटीसी - नींद टाइपिंग है। – Tiny

+0

मैं 'कैलेंडर' ऑब्जेक्ट वापस नहीं कर सकता। जब डेटाबेस को डेटा प्रदान किया जाता है, तो उसे 'java.sql.Timestamp' वापस करना चाहिए। इस तरह जेपीए मैपिंग काम करते हैं। – Tiny

उत्तर

3

आपका ठोस समस्या के कारण होता है। यह मूल रूप से new Date(millis) रिटर्न जिसमें millisDateTime उदाहरण के आंतरिक रूप से संग्रहीत युग समय, बिल्कुल के रूप में DateTime javadoc द्वारा वर्णित और java.util.Date constructor के लिए आवश्यक है।

दूसरे शब्दों में, withZone(DateTimeZone.UTC) हिस्सा पूरी तरह से कोई प्रभाव नहीं यहाँ है। कोड बिल्कुल वैसा ही व्यवहार करता है जैसे कि वह हिस्सा अनुपस्थित था। यह बताता है कि आप मूल रूप से दर्ज समय के साथ क्यों समाप्त होते हैं।

तकनीकी रूप से, समस्या आपके कस्टम जेएसएफ कनवर्टर में है जो String से DateTime में परिवर्तित हो जाती है। वह कनवर्टर स्पष्ट रूप से समय क्षेत्र को ध्यान में नहीं ले रहा है और यह मानते हुए कि इनपुट पहले ही जीएमटी टाइमज़ोन (डिफ़ॉल्ट रूप से) में है। कनवर्टर को निर्देश दिया जाना चाहिए कि इनपुट आईएसटी टाइमज़ोन में है। आप मानक JSF <f:convertDateTime> के साथ मानक java.util.Date संपत्ति का उपयोग कर रहे थे, तो आप यह IST करने के लिए अपने timeZone विशेषता सेट करके किया जा सकता था।

<h:inputText value="#{bean.date}"> 
    <f:convertDateTime pattern="dd-MMM-yyyy hh:mm:ss a" locale="en" timeZone="IST" /> 
</h:inputText> 

आपका कस्टम JSF कनवर्टर कवर के तहत बिल्कुल वैसा ही कर रही किया जाना चाहिए: एपीआई कि आपूर्ति की String यह मानते हैं कि यह GMT समय क्षेत्र में पहले से ही दे के बजाय IST समय क्षेत्र में है बताओ। आप कस्टम JSF कनवर्टर कहीं भी दिखाई नहीं दिया, तो यह सटीक उत्तर आपूर्ति करने के लिए मुश्किल है, लेकिन यह निम्न किकऑफ़ उदाहरण के लिए नीचे उबाल चाहिए:

String inputDateString = "02-Oct-2013 11:34:26 AM"; 
String inputDatePattern = "dd-MMM-yyyy hh:mm:ss a"; 
TimeZone inputTimeZone = TimeZone.getTimeZone("IST"); 

DateTime dateTime = DateTimeFormat 
    .forPattern(inputDatePattern) 
    .withZone(DateTimeZone.forTimeZone(inputTimeZone)) 
    .parseDateTime(inputDateString); 

जिसके परिणामस्वरूप DateTime उदाहरण सही आंतरिक युग होने खत्म हो जाएगा मिलिस में समय

+0

मेरे पास [यह] (http://pastebin.com/xjJtnh8m) जेएसएफ कनवर्टर है लेकिन दुर्भाग्यवश, इससे कोई फर्क नहीं पड़ता। धन्यवाद – Tiny

+0

जेएसएफ कनवर्टर को शामिल करने के लिए स्वयं प्रश्न को संपादित करें। – Tiny

+0

फिर आप या तो नए कनवर्टर नहीं चला रहे हैं या आप परिणामों की गलत व्याख्या कर रहे हैं या समस्या अब तक प्रदान की गई जानकारी में दिखाई नहीं दे रही है। नए कनवर्टर को विशेष रूप से भाग * को ठीक करना चाहिए "लेकिन जब यह मान इस अभिव्यक्ति द्वारा परिवर्तित किया जाता है - (डेटटाइम) ऑब्जेक्ट वैल्यू) .withZone (DateTimeZone.UTC) .toDate(), इसका फिर से मूल्यांकन 2013-10-02 11:34 : 26.0 "*। – BalusC

संबंधित मुद्दे

 संबंधित मुद्दे