【问题标题】:date format Calendar in AndroidAndroid中的日期格式日历
【发布时间】:2020-05-25 18:37:21
【问题描述】:

是这样写的,我想改一下写法。我希望它在 3 月 27 日星期五用土耳其语编写。当我更改 SimpleDateFormat 中的拼写时返回 null。我正在打印从数据库中提取的数据。

我想要的输出是: Cuma Mar 27(Turkish)

数据库输出:

date ":" 2019-11-27 14: 42: 23.000000 "," timezone_type ": 3," timezone ":" UTC "

Android 输出:

Fri Mar 27 14:42:23 GMT+03:00 2020

代码:

JSONObject form_tarih2 = jObj.getJSONObject("form_tarih2");
String date = form_tarih2.getString("date");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", 
        java.util.Locale.getDefault());
Date calculateDate = sdf.parse(date);
tarihstring = calculateDate;

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
calendar.setTime(sdf.parse(String.valueOf(tarihstring)));

calendar.add(Calendar.MONTH,4);
Date future = calendar.getTime();

【问题讨论】:

  • 你能告诉我你想要的输入日期和想要的输出吗?
  • 我更新了话题
  • 你能告诉我这是什么Çar Kas 27吗?我得到这个输出
  • 要再增加 4 个月吗?
  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。

标签: java android simpledateformat


【解决方案1】:

java.time 和 ThreeTenABP

    DateTimeFormatter jsonDateFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS");
    DateTimeFormatter turkishDateFormatter
            = DateTimeFormatter.ofPattern("EEEE MMM d", Locale.forLanguageTag("tr"));
    ZoneId zone = ZoneId.of("Europe/Istanbul");

    String dateFromJson = "2019-11-27 14:42:23.000000";
    String timezoneTypeFromJson = "3";
    String timezoneFromJson = "UTC";

    if (! timezoneTypeFromJson.equals("3")) {
        throw new IllegalStateException("This Stack Overflow answer only supports timezone_type 3");
    }
    LocalDateTime ldt = LocalDateTime.parse(dateFromJson, jsonDateFormatter);
    ZoneId jsonZone = ZoneId.of(timezoneFromJson);
    ZonedDateTime dateTime = ldt.atZone(jsonZone).withZoneSameInstant(zone);
    ZonedDateTime futureDateTime = dateTime.plusMonths(4);
    String wantedDateString = futureDateTime.format(turkishDateFormatter);

    System.out.println(wantedDateString);

输出是期望的:

库马 3 月 27 日

(土耳其语,3 月 27 日星期五

根据this answertimezone_type 3 真正表示region/city 形式的时区ID,例如Europe/London 或Etc/UTC。 UTCEtc/UTC 的别名,所以也可以。

如果您不想要伊斯坦布尔时区的结果,只需在代码中填写一个不同的结果。

SimpleDateFormat 是出了名的麻烦,也无法解析秒为 6 位小数的日期时间字符串(它只支持 3 位小数)。它也早已过时。 DateCalendar 的设计也很糟糕,而且早已过时。我使用的是现代 Java 日期和时间 API,而不是那些类。

或者使用内置的本地化格式

您希望打印的日期带有星期几并省略年份。为此,您需要像上面那样手动指定格式。所以主要是为了其他读者:对于大多数目的,内置格式是合适的,并且有两个潜在的优势:它很好地符合用户的期望,并且很适合国际化。例如:

    DateTimeFormatter turkishDateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.LONG)
            .withLocale(Locale.forLanguageTag("tr"));

27 Mart 2020 库马

或更短:

    DateTimeFormatter turkishDateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.MEDIUM)
            .withLocale(Locale.forLanguageTag("tr"));

2020 年 3 月 27 日

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

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

【解决方案2】:

使用它来转换日期。将其设为静态以在应用程序的任何位置使用

        String s=getFormatedTime("2019-11-27 14: 42: 23.000000","yyyy-MM-dd HH:mm:ss.SSSSSS","EEEE MMM dd");

你的功能:-

public static String getFormatedTime(String dateStr, String strReadFormat, String strWriteFormat) {
    if (dateStr == null) return "";
    String formattedDate = dateStr;

    DateFormat readFormat = new SimpleDateFormat(strReadFormat, Locale.getDefault());
    DateFormat writeFormat = new SimpleDateFormat(strWriteFormat, new Locale("tr"));

    Date date = null;

    try {
        date = readFormat.parse(dateStr);
    } catch (ParseException e) {
    }

    if (date != null) {
        formattedDate = writeFormat.format(date);
    }

    return formattedDate;
}

您可以在结果中再添加 4 个月

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多