如何将facebook post created_time转换为用户的时区?

时间:2012-01-04 22:20:41

标签: java android facebook

我正在使用Facebook SDK在我的Android应用程序中显示Facebook帖子。我有格式的每个帖子的created_time:

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

我能够将其解析为Java Date对象,如下所示:

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

然后,我试图显示一条消息,描述自使用此方法创建帖子以来经过的时间:

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

问题是帖子的create_time比我的时间(EST)早6个小时。所以timeAgoInWords方法无法正常工作。 Facebook是否始终以UTC / GMT +1小时记录帖子的创建时间?

我可以做些什么来转换创建时间,以便timeAgoInWords可以正常工作当前用户的时区,无论它们在哪里?

3 个答案:

答案 0 :(得分:9)

这是我用来将UTC时间字符串转换为本地化时间字符串的代码。请注意,转化的关键是使用TimeZone方法getRawOffset()inDaylightTime(...)getDSTSavings()

请注意,我的日期格式与您使用的日期格式略有不同,因此您需要更改日期格式。

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

显然你想要一个Date对象,所以你只需要更改这一行...

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

...然后您只需要更改方法的返回类型并返回localDate

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

这会将FB时间格式转换为我们的自定义日期格式。使用Graph api进行测试,其工作没有任何问题。