android - 从 Android 中的字符串中提取
问题描述
由于我是编程新手,因此我需要一些帮助。如果我有一个字符串,例如下面的字符串。在这里,您可以看到日期和时间包含在一个字符串中。
String date_time = "2018-03-18T01:39:45+01:00";
无论如何只能从字符串中提取日期。
“2018-03-18”
情况是我有一个包含日期和时间的完整字符串,但我需要为自己提取日期和时间,所以我可以单独使用它。
编辑
抱歉,但我认为最近的热度已经影响了我。我忘了提到字符串存储在 arraylst
List<String> allDate_time = new ArrayList<String>();
JSONObject date_timeArray = json2.getJSONObject( 0 );
String date_time = date_timeArray.getString( "date_time" );
allDate_time.add( date_time );
dateView = (TextView) findViewById( R.id.dateTX );
dateView.setText( allDate_time.get( 0 ));
解决方案
java.time
List<String> allDate_time = new ArrayList<>();
String date_time = "2018-03-18T01:39:45+01:00";
allDate_time.add( date_time );
for (String dateTimeString : allDate_time) {
OffsetDateTime odt = OffsetDateTime.parse(dateTimeString);
LocalDate date = odt.toLocalDate();
LocalTime timeOfDay = odt.toLocalTime();
System.out.println("Date: " + date + ". Time: " + timeOfDay + '.');
}
输出:
日期:2018-03-18。时间:01:39:45。
由于现代 Java 日期和时间 API 的OffsetDateTime
类在java.time
没有任何显式格式化程序的情况下解析您的日期时间字符串,因此不利用它几乎是遗憾的。为什么它如此简单的解释是您的字符串采用 ISO 8601 格式,并且java.time
解析这种格式的类作为它们的默认值。
如果您不确定字符串(此处+01:00
)中的偏移量是否与用户的时区一致,请在提取日期和时间之前转换为该时区。例如:
ZonedDateTime zdt = odt.atZoneSameInstant(ZoneId.of("America/Argentina/Cordoba"));
LocalDate date = zdt.toLocalDate();
LocalTime timeOfDay = zdt.toLocalTime();
通过此更改,输出为:
日期:2018-03-17。时间:21:39:45。
我的建议:
- 使用标准库中的类将日期和时间作为日期和时间对象处理。从长远来看,这比依赖字符串操作更稳定、更容易,并且代码更易于阅读和维护。
- 而不是旧的类
Date
并SimpleDateFormat
在另一个答案中使用,而是在java.time
.Date
并且SimpleDateFormat
是遗产,SimpleDateFormat
尤其是出了名的麻烦。
问题:我可以在 Android 上使用 java.time 吗?
是的,java.time
在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及较新的 Android 设备(据我所知,从 API 级别 26 开始)中,现代 API 是内置的。
- 在 Java 6 和 7 中获得 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从
org.threeten.bp
子包中导入日期和时间类。
链接
- Oracle 教程:日期时间解释如何使用
java.time
. - Java 规范请求 (JSR) 310,
java.time
第一次描述的地方。 - ThreeTen Backport 项目,
java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。 - ThreeTenABP , ThreeTen Backport 的 Android 版
- 问题:如何在Android项目中使用ThreeTenABP,有非常详尽的解释。
- 维基百科文章:ISO 8601
推荐阅读
- javascript - typeahed 仅当字符串包含空格时才执行 ajax 调用
- firebase - (index):7272 crbug/1173575,非 JS 模块文件在 Flutter 和 Firebase 中已弃用
- html - formattable() 中的条纹效果,每隔一行显示浅灰色阴影。R
- mysql - 为什么 Mysql 查询会去统计?
- docker - 已解决——如何在 kubernetes 节点上配置 docker 登录?
- excel - 除非手动更改单元格,否则 Excel 的工作表更改事件不会触发
- javascript - TypeError:react_1.useEffect 不是函数
- git - 在 git db 版本控制中读取更新的对象
- r - 完形填空题的宽容度
- html - 可访问性:正确的 html 代码来发音