2013-01-04 13 views
7

Potrzebuję sformatować datę do określonego ciągu.Android Format daty ze strefą czasową

użyłem SimpleDateFormat klasę formatować datę za pomocą wzorca „yyyy-MM-dd'T'HH:mm:ssZ” to zwraca bieżącą datę jako
2013-01-04T15:51:45+0530”, ale muszę jak
2013-01-04T15:51:45+05:30”.

Poniżej jest kodowanie stosowane

Calendar c = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);  
Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime())); 

Wyjście: sformatowany ciąg: 2013-01-04T15:51:45+0530

muszę formatu jak 2013-01-04T15:51:45+05:30 wystarczy dodać dwukropek w między czasie GMT.

Ponieważ pracuję nad kalendarzem Google, aby wstawić wydarzenie, akceptuje on tylko wymagany format, o którym wspomniałem.

+0

Nie sądzę, że można z prostym formatem. Musisz więc ręcznie wstawić ':'. [Java 7 wprowadziła znacznik "X"] (http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html), który ma więcej opcji formatowania niż 'Z', ale nie jest dostępny na Androida (jeszcze?). – assylias

+0

Jeśli ręczne formatowanie jest zadaniem do wykonania (w odniesieniu do powyższego komentarza), możesz wyszukać ostatnie '+', a następnie dodać ':' po 2 indeksach. –

+0

@KazekageGaara Może to być również '-' ... – assylias

Odpowiedz

9

Zamiast tego można użyć Joda Time. Jego DateTimeFormat ma atrybut formatu ZZ, który robi to, co chcesz.

Link

Duża zaleta: w przeciwieństwie SimpleDateFormat, DateTimeFormatter jest bezpieczne dla wątków. Użycie:

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ") 
    .withLocale(Locale.ENGLISH); 
+0

Znalazłem nieco inny sposób robienia tego, biorąc pod uwagę: DateTime my_date = new DateTime(); ... Ustaw datę, aby coś my_date = ... następnie sformatować go. String curr_date = my_date.toLocalDate() toString ("yyyy-MM-dd"); – Brandon

+0

czy wypróbowałeś "yyyy-MM-dd'T'HH: mm: ssXXX' –

+0

@fge" ZZ "rozwiązany dla mnie. Dzięki! ;) –

1

Co można zrobić, to po prostu dodać ":" ręcznie za pomocą ciągu(). Zmierzyłem się z tym wcześniej i to rozwiązanie działa.

1

Spróbuj

Calendar c = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH); 

System.out.println("formatted string: "+sdf.format(c.getTime())); 

String text = sdf.format(c.getTime()); 
String result = text.substring(0, 22) + ":" + text.substring(22); 
System.out.println("result = " + result); 
1

Dlaczego nie po prostu to zrobić ręcznie z regexp?

String oldDate = "2013-01-04T15:51:45+0530"; 
String newDate = oldDate.replaceAll("(\\+\\d\\d)(\\d\\d)", "$1:$2"); 

Ten sam wynik, z podciągiem (jeśli wydajność jest problem).

String oldDate = "2013-01-04T15:51:45+0530"; 
int length = oldDate.length(); 
String newDate = oldDate.substring(0, length - 2) + ':' + oldDate.substring(length - 2); 
0

Spróbuj kod

Calendar c = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z", Locale.ENGLISH); 
String s = sdf.format(c.getTime()); 
String fDate = s.substring(0, s.length()-2) +":"+s.substring(s.length()-2, s.length()); 
Log.e("check", "formatted string: "+fDate); 
24

Można również użyć "ZZZZZ" zamiast "Z" w swojej strukturze (według documentation). Coś takiego

Calendar c = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.ENGLISH);  
    Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime())); 
+1

To jest poprawna odpowiedź, @fargath powinieneś oznaczyć ją. – VAdaihiep

+0

To powinna być poprawna odpowiedź. Uważam to za niedorzeczne, gdy ludzie odnoszą się do bibliotek jako podstawowego rozwiązania, a nie do wtórnej sugestii. To jak nawlekanie płótna z mieczem. – humblerookie

+0

Dokumentacja mówi, że obsługuje X. – rozina

0

prostu byłaby ten kod i zastąpić 'Locale.getDefault()' z Locale trzeba

private SimpleDateFormat getDateFormat() { 
    SimpleDateFormat dateFormat = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.DEFAULT, Locale.getDefault()); 
    String pattern = dateFormat.toLocalizedPattern(); 
    pattern = pattern.trim(); 
    dateFormat.applyLocalizedPattern(pattern); 
    return dateFormat; 
} 

// I tu jest wykorzystanie

SimpleDateFormat SDF = getDateFormat();

sdf.format (new Date());