2012-01-04 12 views
9

Android uygulamasında Facebook gönderilerini Facebook SDK'yı kullanarak görüntülüyorum. Ben formatında her bir yayın için CREATED_TIME vardır:created_time facebook post'unu kullanıcının saat dilimine nasıl dönüştürebilirim?

2012-01-04T12:28:52+0000 

ben şöyle bir Java Date nesnesine bu ayrıştırmak başardı:

public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss+SSSS"; 
public static Date parseDate(String str) { 
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); 

    try { 
     Date date = sdf.parse(str); 
    } catch(ParseException e) { 
     Log.w(TAG, "Unable to parse date string \"" + str + "\""); 
    } 
    return date; 
    } 

Sonra ben açıklayan bir ileti görüntüler çalışılıyor sonrası bu yöntem kullanılarak oluşturulan itibaren geçen zamanı:

public static String timeAgoInWords(Date from) { 
    Date now = new Date(); 
    long difference = now.getTime() - from.getTime(); 
    long distanceInMin = difference/60000; 

    if (0 <= distanceInMin && distanceInMin <= 1) { 
     return "Less than 1 minute ago"; 
    } else if (1 <= distanceInMin && distanceInMin <= 45) { 
     return distanceInMin + " minutes ago"; 
    } else if (45 <= distanceInMin && distanceInMin <= 89) { 
     return "About 1 hour"; 
    } else if (90 <= distanceInMin && distanceInMin <= 1439) { 
     return "About " + (distanceInMin/60) + " hours ago"; 
    } else if (1440 <= distanceInMin && distanceInMin <= 2529) { 
     return "1 day"; 
    } else if (2530 <= distanceInMin && distanceInMin <= 43199) { 
     return (distanceInMin/1440) + "days ago"; 
    } else if (43200 <= distanceInMin && distanceInMin <= 86399) { 
     return "About 1 month ago"; 
    } else if (86400 <= distanceInMin && distanceInMin <= 525599) { 
     return "About " + (distanceInMin/43200) + " months ago"; 
    } else { 
     long distanceInYears = distanceInMin/525600; 
     return "About " + distanceInYears + " years ago"; 
    } 
} 

sorun yazının create_time 6 saat ileri zamanımın (EST) olmasıdır. Yani timeAgoInWords yöntemi düzgün çalışmıyor. Facebook her zaman UTC/GMT +1 saat içinde gönderilerin oluşturulma süresini kaydeder mi?

Oluşturma süresini dönüştürmek için ne yapabilirim, böylece timeAgoInWords, geçerli kullanıcı saat dilimi için nerede çalışırlarsa çalışırlar, düzgün çalışırlar?

cevap

9

UTC saat dizgesini yerelleştirilmiş bir zaman dizgesine dönüştürmek için kullandığım kod budur. Dönüşümün anahtarı, TimeZone yöntemlerini getRawOffset(), inDaylightTime(...) ve getDSTSavings() kullanmaktır.

Not tarih formatım kullandığınız şeyden biraz farklı olduğundan, değiştirmeniz gerekecek. daha sonra

Açıkçası
public String GetLocalDateStringFromUTCString(String utcLongDateTime) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    String localDateString = null; 

    long when = 0; 
    try { 
     when = dateFormat.parse(utcLongDateTime).getTime(); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    localDateString = dateFormat.format(new Date(when + TimeZone.getDefault().getRawOffset() + (TimeZone.getDefault().inDaylightTime(new Date()) ? TimeZone.getDefault().getDSTSavings() : 0))); 

    return localDateString; 
} 

sadece bu hat değiştirmek gerekir böylece bir Date nesne istiyorum ...

localDateString = dateFormat.format(new Date(when + TimeZone.getDefault().getRawOffset() + (TimeZone.getDefault().inDaylightTime(new Date()) ? TimeZone.getDefault().getDSTSavings() : 0))); 

... ...

Date localDate = new Date(when + TimeZone.getDefault().getRawOffset() + (TimeZone.getDefault().inDaylightTime(new Date()) ? TimeZone.getDefault().getDSTSavings() : 0)); 

... sen sadece yöntemin dönüş türünü değiştirmeli ve localDate'u döndürmelisiniz.

+0

Teşekkürler! Bu benim için yaptı. Sanırım kafam karışmıştı çünkü Facebook'un bana verdiği zaman UTC zamanında olduğundan bile emin değildim. Ama sanırım öyleydi, teşekkürler! – mattgmg1990

+0

Yardım etmesine sevindim. Dürüst olmak gerekirse facebook hakkında hiçbir şey bilmiyorum, ancak herhangi bir global sistemin UTC kullanması mantıklı olacaktır. – Squonk

+0

Neden sadece tarih desenine saat dilimi eklemezsiniz ve yerel saat diliminize dönüşür? Örneğin. "Yyyy-AA-gg'T'SS: dd: ssZZZZZ" – Andrew

0
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
     df.setTimeZone(TimeZone.getTimeZone("**USER_TIME_ZONE**")); 
0

@Squonk kodu,

public String GetLocalDateStringFromUTCString(String utcLongDateTime) { 
    SimpleDateFormat fb_dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZZZZZ"); 

    SimpleDateFormat my_dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 


    String localDateString = null; 

    long when = 0; 
    try { 
     when = fb_dateFormat.parse(utcLongDateTime).getTime(); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    localDateString = my_dateFormat.format(new Date(when + TimeZone.getDefault().getRawOffset() + (TimeZone.getDefault().inDaylightTime(new Date()) ? TimeZone.getDefault().getDSTSavings() : 0))); 

    return localDateString; 
} 

bizim özel DateFormat içine Bu dönüştürme FB saat biçimi. Grafik API kullanarak test edildi ve herhangi bir sorun olmadan çalışmaları.

İlgili konular