android 如何解析从Facebook检索到的日期字符串中的时间

rjee0c15  于 2023-01-11  发布在  Android
关注(0)|答案(4)|浏览(173)

我得到这些时间从Facebook的事件。例如:start_time,它是这样的字符串:
2013年12月21日星期一18:30:00+0100
现在我只想要时间,就像:
18.30
我试着这样做:

SimpleDateFormat formatter = new SimpleDateFormat(" EEEE, dd MMMM yyyy", java.util.Locale.getDefault());
                Date formatted = null;
                try {
                    formatted = formatter.parse(p.getStart_time());
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                String formattedString = formatted.toString();
                txtStart_time.setText(""+formattedString);

p.getStart_time()是一个字符串,它给出了我之前说过的日期。
如果我使用这个方法,我会得到一个错误:
无法分析日期。
有人知道附近有什么工作吗?

3mpgtkmj

3mpgtkmj1#

您需要两种格式:一个用于解析日期,一个用于格式化日期

String startTime = "2013-12-21T18:30:00+0100";
SimpleDateFormat incomingFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date date = incomingFormat.parse(startTime);

SimpleDateFormat outgoingFormat = new SimpleDateFormat(" EEEE, dd MMMM yyyy", java.util.Locale.getDefault());

System.out.println(outgoingFormat.format(date));

印刷品

Saturday, 21 December 2013
nr9pn0ug

nr9pn0ug2#

使用类似yyyy-MM-dd'T'HH:mm:ssZ的格式代替EEEE, dd MMMM yyyy作为解析格式。

oo7oh9g9

oo7oh9g93#

我得到这些时间从Facebook的事件。例如:start_time,它是这样的字符串:
2013年12月21日星期一18:30:00 + 0100
现在我只想要时间,就像:
18.30

使用java.time(现代日期-时间API)的解决方案:

OffsetDateTime.parse(
    "2013-12-21T18:30:00+0100", 
    DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ")
).toLocalTime()
    • 说明:**您的日期-时间字符串的时区偏移量为+01:00小时。java.time API为您提供了OffsetDateTime以包含日期-时间单位的信息以及时区偏移量。使用适用的DateTimeFormatter,将字符串解析为OffsetDateTime,然后使用OffsetDateTime#toLocalTime获取此日期-时间的LocalTime部分。
    • 使用java.time API进行演示**:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

class Main {
    public static void main(String[] args) {
        System.out.println(OffsetDateTime.parse(
            "2013-12-21T18:30:00+0100", 
            DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ")
        ).toLocalTime());
    }
}
    • 输出**:
18:30

ONLINE DEMO

    • 注意:**此处可以使用y代替u,但必须使用I preferuy

从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

关于旧版API的说明:

问题和accepted answer使用了java.util.DateSimpleDateFormat,这在2013年是正确的做法。2014年3月,java.util日期时间API及其格式化API SimpleDateFormatmodern date-time API取代。从那时起,强烈建议停止使用传统的日期时间API。

ycl3bljg

ycl3bljg4#

子字符串

如果您所需要的只是从字符串中提取的时间成分,请调用String类的substring方法...

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

String dateTimeStringFromFacebook = "2013-12-21T18:30:00+0100";

// Extract a substring.
String timeSubstring = dateTimeStringFromFacebook.substring( 11, 19 );

日期时间对象

如果要将时间转换为特定时区,请将字符串转换为日期-时间对象。使用格式化程序仅表示时间组件。
下面是一些使用Joda-Time 2.3库的示例代码。避免使用众所周知的糟糕的java.util.Date/Calendar类。使用Joda-Time或Java 8捆绑的新java.time.* JSR 310类。

// From String to DateTime object.
DateTime dateTime = new DateTime( dateTimeStringFromFacebook, DateTimeZone.UTC );

// From DateTime object to String
// Extract just the hours, minutes, seconds.
DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm:ss");
String timeFragment_Paris = formatter.withZone( DateTimeZone.forID( "Europe/Paris" ) ).print( dateTime );
String timeFragment_Kolkata = formatter.withZone( DateTimeZone.forID( "Asia/Kolkata" ) ).print( dateTime ); // Formerly known as Calcutta, India.

转储到控制台...

System.out.println( "dateTimeStringFromFacebook: "  + dateTimeStringFromFacebook );
System.out.println( "timeSubstring: " + timeSubstring );
System.out.println( "dateTime: "  + dateTime );
System.out.println( "timeFragment_Paris: "  + timeFragment_Paris );
System.out.println( "timeFragment_Kolkata: " + timeFragment_Kolkata + " (Note the 00:30 difference due to +05:30 offset)");

运行时...

dateTimeStringFromFacebook: 2013-12-21T18:30:00+0100
timeSubstring: 18:30:00
dateTime: 2013-12-21T17:30:00.000Z
timeFragment_Paris: 18:30:00
timeFragment_Kolkata: 23:00:00 (Note the 00:30 difference due to +05:30 offset)

思考时区

你的问题没有解决时区的问题。养成一个习惯,在处理日期-时间值时总是考虑时区。如果你指的是同一个时区,明确地说出来。如果你指的是Java环境的默认时区,就说出来。如果你指的是UTC......好吧,你明白了。

相关问题