2012-04-23 14 views
15

मेरे पास एक ऐसा फ़ंक्शन है जो क्लाइंट और सर्वर दोनों पर समान तरीके से काम करना चाहिए और यह प्रारूपों को प्रारूपित करता है।जीडब्ल्यूटी: सर्वर पर डेटटाइमफॉर्मेट का उपयोग करें और सर्वर पर SimpleDateFormat

if (GWT.isClient()) 
{ 
    // Use DateTimeFormat 
} else { 
    // Use SimpleDateFormat 
} 

जीडब्ल्यूटी शिकायत करता है: SimpleDateFormat टाइप करने के लिए कोई स्रोत कोड उपलब्ध नहीं है। त्रुटि घातक नहीं है (कम से कम देव मोड में), लेकिन परेशान करने और इसे दबाने का कोई तरीका नहीं है। http://groups.google.com/group/google-web-toolkit/browse_thread/thread/981247fca161c287 पर एक समान प्रश्न मिला। वहां वे सुझाव देते हैं:

आप SimpleDateTimeFormat का डमी सुपरसॉरस कार्यान्वयन प्रदान कर सकते हैं ताकि यह संकलित हो सके।

मैंने कोशिश की। अब ग्रहण की शिकायत:

java.text घोषित पैकेज "java.text" उम्मीद पैकेज "foo.jre.java.text" SimpleDateFormat.java

उत्तर

0

आप को बताने के लिए मेल नहीं खाता है ग्रहण अपनी सुपर-स्रोत वाली जावा फ़ाइल को संकलित न करें। यदि आप मेवेन का उपयोग कर रहे हैं, तो यह केवल इसे src/main/संसाधनों में स्थानांतरित करने का विषय है; अन्यथा, ग्रहण के निर्माण पथ से अपने 'jre' पैकेज को बाहर करें।

... कहा जा रहा है कि, मैं क्लास को सरल-स्रोतफॉर्मैट/डेटटाइमफॉर्मैट का उपयोग करने के लिए सुपर-स्रोत का उपयोग करता हूं, और/या एक सुपरपर क्लास में ले जाता हूं जिसे आप सुपर-स्रोत चाहते हैं।

0
import java.util.Date; 

import com.google.gwt.core.shared.GWT; 
import com.google.gwt.thirdparty.guava.common.annotations.GwtCompatible; 
import com.google.gwt.thirdparty.guava.common.annotations.GwtIncompatible; 

public abstract class DateTimeFormat 
{ 
    static DateTimeFormat getFormat(String pattern) 
    { 
     if (GWT.isClient()) 
      return DateTimeFormatClient.getFormat(pattern); 
     else 
      return DateTimeFormatServer.getFormat(pattern); 
    } 

    public abstract String format(Date date); 

    @GwtCompatible 
    private static class DateTimeFormatClient extends DateTimeFormat 
    { 
     private com.google.gwt.i18n.client.DateTimeFormat dateTimeFormat; 

     protected DateTimeFormatClient(String pattern) 
     { 
      this.dateTimeFormat = com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern); 
     } 

     public static DateTimeFormat getFormat(String pattern) 
     { 
      return new DateTimeFormatClient(pattern); 
     } 

     public String format(Date date) 
     { 
      return dateTimeFormat.format(date); 
     } 
    } 

    @GwtIncompatible("Server version of the class") 
    private static class DateTimeFormatServer extends DateTimeFormat 
    { 
     private java.text.SimpleDateFormat dateTimeFormat; 

     protected DateTimeFormatServer(String pattern) 
     { 
      this.dateTimeFormat = new java.text.SimpleDateFormat(pattern); 
     } 

     public static DateTimeFormat getFormat(String pattern) 
     { 
      return new DateTimeFormatServer(pattern); 
     } 

     public String format(Date date) 
     { 
      return dateTimeFormat.format(date); 
     }  

    } 
} 
+0

क्या इसे http://code.google.com/p/google-web-toolkit/source/detail?r=11570 से @GwtIncompatible की आवश्यकता है? – fgb

+1

अब इसे जीडब्ल्यूटी 2.6 में जारी किया गया है (लेकिन आप सही हैं, यह 2.5.1 या उससे पहले नहीं था) –

+1

जीडब्ल्यूटी 2.7 में काम नहीं करता है: 'विधि getFormat (स्ट्रिंग) टाइपटाइमफॉर्मैट के प्रकार के लिए अपरिभाषित है। डेटटाइमफॉर्मैटसेवर – stepancheg

27

आप दोनों सर्वर और ग्राहक पर com.google.gwt.i18n.shared.DateTimeFormat उपयोग कर सकते हैं:

कॉल संरक्षित निर्माता GWT.create

String pattern = "yyyyMMdd"; /*your pattern here*/ 
DefaultDateTimeFormatInfo info = new DefaultDateTimeFormatInfo(); 
DateTimeFormat dtf = new DateTimeFormat(pattern, info) {}; // <= trick here 

उदाहरण से बचने के लिए

Date d = dtf.parse("20120301"); 
CalendarUtil.addDaysToDate(d, -1); 
String s = dtf.format(d); 
// s now contains "20120229" 

चाल द्वारा किया जाता है DateTimeFormat का विस्तार करना ताकि हमके साथ संरक्षित कन्स्ट्रक्टर का उपयोग कर सकेंजहाँ हम new DefaultDateTimeFormatInfo() का उपयोग GWT.create

1

का यह समाधान बुला से बचने के लिए कुछ अलग लेकिन एक @ochakov प्रस्तुत की एक ही रास्ते में है, लेकिन यह GWT 2.7 समस्या @stepancheg हल करता है और मैं उल्लेख किया है।

import java.util.Date; 

import com.google.gwt.core.client.GWT; 
import com.google.gwt.thirdparty.guava.common.annotations.GwtCompatible; 
import com.google.gwt.thirdparty.guava.common.annotations.GwtIncompatible; 

public abstract class DateTimeFormat { 
    static DateTimeFormat getFormat(String pattern) 
    { 
     if (GWT.isClient()) 
      return new DateTimeFormatClient(pattern); 
     else 
      return new DateTimeFormatServer(pattern); 
    } 

    public abstract String format(Date date); 

    public abstract Date parse(String dateString); 

    @GwtCompatible 
    private static class DateTimeFormatClient extends DateTimeFormat 
    { 
     protected String pattern; 

     public DateTimeFormatClient(String pattern) 
     { 
      this.pattern = pattern; 
     } 


     public String format(Date date) 
     { 
      return com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern).format(date); 
     } 

     public Date parse(String stringDate){ 
      return com.google.gwt.i18n.client.DateTimeFormat.getFormat(pattern).parseStrict(stringDate); 
     } 
    } 

    private static class DateTimeFormatServer extends DateTimeFormatClient 
    { 

     public DateTimeFormatServer(String pattern) 
     { 
      super(pattern); 
     } 


     @GwtIncompatible("Server format") 
     public String format(Date date) 
     { 
      return (new java.text.SimpleDateFormat(pattern)).format(date); 
     } 

     @GwtIncompatible("Server parse") 
     public Date parse(String dateString){ 
      try{ 
       return (new java.text.SimpleDateFormat(pattern)).parse(dateString); 
      }catch(Exception ex){ 
      throw new IllegalArgumentException("Cannot convert to date: "+ dateString); 
      } 
     } 

    } 
} 

आशा है कि यह दूसरों की मदद करे।

1
import com.google.gwt.i18n.shared.DateTimeFormat; 
DateTimeFormat fm = DateTimeFormat.getFormat("MM/dd"); 
String st = fm.format(date); 
+0

बहुत साफ समाधान। – Vic

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