首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查字符串日期中是否有时间,并在Android中执行一些操作。

检查字符串日期中是否有时间,并在Android中执行一些操作。
EN

Stack Overflow用户
提问于 2021-03-05 15:02:39
回答 2查看 83关注 0票数 0

我有一个方法来格式化我的特定数据字符串。

代码语言:javascript
复制
public static String dateFormatter(String dateToFormat){

        SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd", Locale.UK);


        // All the fields in dateFormatter must be in dateParser
        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy, MMM d, EEE", Locale.UK);

        Date date = new Date();

        try {

            date = dateParser.parse(dateToFormat);

        } catch (ParseException e) {

            e.printStackTrace();

        }

        assert date != null;
        
        return dateFormatter.format(date);
    }

问题是字符串日期解析为dateToFormat,可以采用以下日期格式模式

  1. 2021-03-02将在dateParser中使用“yyyy dd”的日期格式模式。
  2. 2021-03-02 20:16将在dateParser中使用“yyyy:mm”的日期格式模式。
  3. 2021-03-02 20:16:28将在dateParser中使用“yyyy:mm:ss”的日期格式模式。

我希望为dateParser分配一个if语句,而不是每次返回代码,以便dateParser根据解析的日期使用特定的格式。

代码语言:javascript
复制
        SimpleDateFormat dateParser;

        if ("yyyy-MM-dd"){

            dateParser = new SimpleDateFormat("yyyy-MM-dd", Locale.UK);

        }else if ("yyyy-MM-dd HH:mm") {

            dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.UK);

        }else if ("yyyy-MM-dd HH:mm:ss") {

            dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.UK);

        }

其中,“yyyy”和“yyyy:mm”是解析的字符串dateToFormat的格式模式。

EN

回答 2

Stack Overflow用户

发布于 2021-03-05 15:22:35

为yyyy dd,yyyy:mm,yyyy:mm:ss分别创建3种不同的格式化程序formatter1,formatter2,formatter3

代码语言:javascript
复制
 private String dateFormatter(String dateToFormat) {
    Date date = null;
    SimpleDateFormat formatter1=new SimpleDateFormat("yyyy-MM-dd", Locale.UK);
    SimpleDateFormat formatter2=new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.UK);
    SimpleDateFormat formatter3=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.UK);
    try {
        try {
            date = formatter1.parse(dateToFormat);
        } catch (
                Exception exp) {
            try {
                date = formatter2.parse(dateToFormat);
            } catch (Exception exp2) {
                try {
                    date = formatter3.parse(dateToFormat);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        }

        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy, MMM d, EEE", Locale.UK);
        return dateFormatter.format(date);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
票数 0
EN

Stack Overflow用户

发布于 2021-03-05 19:47:20

java.time和格式模式的可选部分

考虑使用java.time,现代java.time和time,用于您的日期工作。下面的方法执行此操作。由于在java.time中没有理由为每个调用重新创建格式化程序,所以我将它们放置在方法之外。

代码语言:javascript
复制
private static final DateTimeFormatter inputParser
        = DateTimeFormatter.ofPattern("uuuu-MM-dd[ HH:mm[:ss]]");
private static final DateTimeFormatter outputFormatter 
        = DateTimeFormatter.ofPattern("uuuu, MMM d, EEE", Locale.UK);

public static String dateFormatter(String dateToFormat){
    LocalDate date = LocalDate.parse(dateToFormat, inputParser);
    return date.format(outputFormatter);
}

试试看:

代码语言:javascript
复制
    System.out.println("2021-03-02          -> " + dateFormatter("2021-03-02"));
    System.out.println("2021-03-02 20:16    -> " + dateFormatter("2021-03-02 20:16"));
    System.out.println("2021-03-02 20:16:28 -> " + dateFormatter("2021-03-02 20:16:28"));

产出如下:

2021-03-02 -> 2021,Mar 2,Tue 2021-03-02 20:16 -> 2021,Mar 2,Tue 2021-03-02 20:16:28 -> 2021,Tue 2021,Tue

输入解析器格式模式字符串中的方括号表示可选部分。所以一天中的时间是允许的或不允许的。如果它在那里,那么秒就会被允许出现或缺席。

这就是说,您不应该将您的日期和时间作为字符串处理在您的应用程序中。处理LocalDate,或者如果您可能需要一天中的时间,例如ZonedDateTime。当您得到字符串输入时,首先解析它。并且只有在必须给出字符串输出时才将格式格式化为字符串。

用if语句

你能找到我可以使用SimpleDateFormat的方法吗?

我不想那样做。SimpleDateFormat类是类中臭名昭著的麻烦制造者,幸运的是它早已过时。

我有一种只能使用if语句的方法,这样我就不用使用太多的SimpleDateFormats了

它不会减少格式化程序,但您可以使用if语句。只要按字符串的长度来选择;

代码语言:javascript
复制
public static String dateFormatter(String dateToFormat){
    LocalDate date;
    if (dateToFormat.length() == 10) { // uuuu-MM-dd
        date = LocalDate.parse(dateToFormat, dateParser);
    } else if (dateToFormat.length() == 16) { // uuuu-MM-dd HH:mm
        date = LocalDate.parse(dateToFormat, dateTimeNoSecsParser);
    } else if (dateToFormat.length() == 19) { // uuuu-MM-dd HH:mm:ss
        date = LocalDate.parse(dateToFormat, dateTimeWithSecsParser);
    } else {
        throw new IllegalArgumentException("Unsupported length " + dateToFormat.length());
    }
    return date.format(outputFormatter);
}

现在我们需要声明四个格式化程序,三个用于解析,一个用于格式化。我要把构建解析器留给你自己。

我想,同样的if-否则结构也适用于SimpleDateFormat。您甚至可以从输入字符串的长度中选择格式模式字符串,并且在方法的每个调用中只构造一个SimpleDateFormat实例。重复一遍:我自己不会使用SimpleDateformat

问: java.time不需要Android级别26吗?

调用需要API级别26 (当前最小值为16):java.time.format.DateTimeFormatter#ofPattern

编辑:与您从这条错误信息中可能想到的相反,java.time在较旧的和较新的安卓设备上都能很好地工作。它只需要至少Java 6

  • 在Java 8和更高版本以及更新的Android设备上(从API级别26),现代API是内置的。
  • 在非Android 6和7中,获取ThreeTen Backport,这是现代类的后端(ThreeTen用于JSR 310;参见底部的链接)。
  • 在较旧的安卓系统上,要么使用desugaring,要么使用Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类。

链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66494883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档