如何在Android应用中转换/Date(时间戳)/格式字符串为完整日期时间
嘿,这个问题我熟!这种带/Date(1527677209864)/格式的日期是.NET常用的JSON日期格式,在Android里处理起来其实很简单,给你几种靠谱的实现方式:
方法一:手动提取时间戳转换(最直接)
这种方法不需要额外依赖,核心思路就是先从字符串里提取出括号里的毫秒级时间戳,再转成日期并格式化。
Java 代码示例:
// 假设API返回的日期字符串 String dateStr = "/Date(1527677209864)/"; // 提取时间戳:去掉非数字字符,转成long类型 long timestamp = Long.parseLong(dateStr.replaceAll("[^0-9]", "")); // 转成Date对象 Date date = new Date(timestamp); // 格式化你需要的日期时间格式,比如"yyyy-MM-dd HH:mm:ss" SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); String formattedDateTime = sdf.format(date);
Kotlin 代码示例:
val dateStr = "/Date(1527677209864)/" // 过滤出数字字符并转成Long类型的时间戳 val timestamp = dateStr.filter { it.isDigit() }.toLong() val date = Date(timestamp) val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) val formattedDateTime = sdf.format(date)
方法二:用Java 8+日期API(推荐,线程安全)
SimpleDateFormat存在线程不安全的问题,如果你开发的应用目标是Android 8.0(API 26)及以上,推荐使用java.time包下的新日期API;如果要兼容低版本,可以引入ThreeTenABP库(Android版的JSR-310实现)。
Android 8.0+ Java 代码示例:
String dateStr = "/Date(1527677209864)/"; long timestamp = Long.parseLong(dateStr.replaceAll("[^0-9]", "")); // 从毫秒时间戳生成Instant,再转成本地时区的LocalDateTime Instant instant = Instant.ofEpochMilli(timestamp); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); // 自定义格式化样式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); String formattedDateTime = formatter.format(localDateTime);
Android 8.0+ Kotlin 代码示例:
val dateStr = "/Date(1527677209864)/" val timestamp = dateStr.filter { it.isDigit() }.toLong() val instant = Instant.ofEpochMilli(timestamp) val localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()) val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) val formattedDateTime = formatter.format(localDateTime)
方法三:结合Gson自动解析(适合JSON序列化/反序列化场景)
如果你的项目用Gson来解析API返回的JSON,可以自定义一个TypeAdapter,让Gson自动处理这种日期格式,不用每次手动解析。
Java 自定义TypeAdapter示例:
public class DotNetDateAdapter extends TypeAdapter<Date> { @Override public void write(JsonWriter out, Date value) throws IOException { // 如果需要把Date转成/Date(xxx)/格式的字符串,这里写反向逻辑 out.value("/Date(" + value.getTime() + ")/"); } @Override public Date read(JsonReader in) throws IOException { String dateStr = in.nextString(); long timestamp = Long.parseLong(dateStr.replaceAll("[^0-9]", "")); return new Date(timestamp); } }
注册TypeAdapter到Gson:
Gson gson = new GsonBuilder() .registerTypeAdapter(Date.class, new DotNetDateAdapter()) .create(); // 之后用这个gson对象解析JSON时,会自动把/Date(xxx)/转成Date对象 YourModel model = gson.fromJson(jsonString, YourModel.class);
一些注意点:
- 这个格式里的时间戳是毫秒级的,别当成秒来处理,否则日期会偏差几十年
- 如果要兼容Android 7.0及以下,ThreeTenABP是个不错的选择,它和Java 8的日期API用法几乎一致
SimpleDateFormat是线程不安全的,尽量不要在全局单例中复用,或者用ThreadLocal来包装它
内容的提问来源于stack exchange,提问作者mahmoud yahia
相关产品推荐
相关产品推荐

