2012-01-04 29 views
9

Tôi đang hiển thị các bài đăng trên Facebook trong ứng dụng Android của mình bằng cách sử dụng SDK Facebook. Tôi có created_time cho mỗi bài đăng trong các định dạng:Làm cách nào để chuyển đổi bài đăng trên facebook created_time thành múi giờ của người dùng?

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

tôi đã có thể phân tích này vào một ngày đối tượng Java như vậy:

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; 
    } 

Sau đó, tôi đang cố gắng để hiển thị một thông điệp mô tả thời gian đã trôi qua kể từ khi bài đã được tạo ra bằng phương pháp này:

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"; 
    } 
} 

vấn đề là các create_time của bài là 6 giờ trước thời hạn của tôi (EST). Vì vậy, phương thức timeAgoInWords không hoạt động chính xác. Facebook có luôn ghi lại thời gian tạo bài đăng trong UTC/GMT +1 giờ không?

Tôi có thể làm gì để chuyển đổi thời gian tạo để timeAgoInWords hoạt động chính xác cho múi giờ của người dùng hiện tại, cho dù chúng ở đâu?

Trả lời

9

Đây là mã tôi sử dụng để chuyển đổi chuỗi thời gian UTC thành chuỗi thời gian được bản địa hóa. Lưu ý khóa để chuyển đổi là sử dụng các phương thức TimeZonegetRawOffset(), inDaylightTime(...)getDSTSavings().

Lưu ý rằng định dạng ngày của tôi hơi khác với những gì bạn đang sử dụng, do đó bạn sẽ cần thay đổi nó.

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; 
} 

Rõ ràng bạn muốn có một đối tượng Date vì vậy bạn chỉ cần thay đổi dòng này ...

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)); 

... sau đó bạn chỉ cần thay đổi kiểu trả về của phương thức và trả lại localDate.

+0

Cảm ơn! Điều đó đã làm nó cho tôi. Tôi nghĩ rằng tôi đã nhầm lẫn bởi vì tôi thậm chí không chắc chắn nếu thời gian Facebook đã cho tôi là trong thời gian UTC. Nhưng tôi đoán nó là, cảm ơn bạn! – mattgmg1990

+0

Vui vì nó đã giúp. Thành thật mà nói tôi không biết bất cứ điều gì về facebook nhưng nó sẽ có ý nghĩa đối với bất kỳ hệ thống toàn cầu để sử dụng UTC. – Squonk

+0

Tại sao không chỉ thêm múi giờ cho mẫu ngày và nó sẽ chuyển đổi thành múi giờ địa phương của bạn? ví dụ. "yyyy-MM-dd'T'hh: mm: ssZZZZZ" – Andrew

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

đang @Squonk,

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; 
} 

này chuyển đổi định dạng FB thời gian vào DateFormat tùy chỉnh của chúng tôi. thử nghiệm bằng cách sử dụng đồ thị api, và các công trình của nó mà không có bất kỳ vấn đề.

Các vấn đề liên quan