无法将字符串转换为西班牙语日期

时间:2018-07-27 15:11:16

标签: android date kotlin locale

我正在尝试使用"2017-05-22"将表示日期Date()的字符串解析为SimpleDateFormat()。我还需要用西班牙语进行日期转换,因此我要使用西班牙文配置来创建Locale。问题是由于某种原因我仍然得到英语输出。我的手机的“语言和输入法”配置默认为英语,但我也尝试将其更改为西班牙语。这是完整的代码:

    val localeSpanish = Locale("es", "ES")
    val dateFormat = SimpleDateFormat("yyyy-MM-dd", localeSpanish)
    val dateInSpanish = dateFormat.parse("2017-01-29")

我在输出中得到这个:

Wed Jan 11 00:00:00 GMT-04:00 2017

有人可以告诉我我在做什么错吗?

5 个答案:

答案 0 :(得分:1)

正如其他人所述,当您输出dateInSpanish时,您将暴露一个Date实例,该实例正在调用其toString方法,并且其实现会基于静态数组构造该字符串包含英文单词

//From java.util.Date
private final static String wtb[] = {
    "am", "pm",
    "monday", "tuesday", "wednesday", "thursday", "friday",
    "saturday", "sunday",
    "january", "february", "march", "april", "may", "june",
    "july", "august", "september", "october", "november", "december",
    "gmt", "ut", "utc", "est", "edt", "cst", "cdt",
    "mst", "mdt", "pst", "pdt"
};

在声明dateFormatter时,它意味着要转换日期/字符串,如以下示例所示:

val dateFormatter = SimpleDateFormat("yyyy-MM-dd", localeSpanish)
println(dateFormatter.parse("2017-01-29")) // prints: Wed Jan 29 00:00:00 GMT-02:00 2017
println(dateFormatter.format(Date()) // prints: 2018-07-27 (as today :p)

我认为您应该使用其他掩码以获得格式化的字符串。 但是,如果您被迫以这种格式读取日期,则必须声明两个格式化程序:

val readerFormatter = SimpleDateFormat("yyyy-MM-dd", localeSpanish)
val writerFormatter = SimpleDateFormat("d 'de' MMMM 'del' yyyy", localeSpanish)
val readDate: Date = readerFormatter.parse("2017-01-29")
val dateInSpanish: String = writerFormatter.format(readDate)
println(dateInSpanish) // prints: 29 de enero del 2017 (as today :p)

答案 1 :(得分:1)

抱歉,我还不能写Kotlin。可以翻译成Java吗?

    Locale localeSpanish = new Locale("es", "ES");
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
            .withLocale(localeSpanish);
    LocalDate date = LocalDate.parse("2017-01-29");
    String formattedDate = date.format(dateFormatter);
    System.out.println("Fecha en español: " + formattedDate);

此打印:

  

西班牙文:2017年12月29日

消息:

  • 您使用的日期时间类SimpleDateFormatDate早已过时且设计欠佳。 SimpleDateFormat特别以麻烦而著称。尽管名称Date代表一个时间点,而不是一个日期。而是使用现代Java日期和时间API java.time。
  • 对于没有时间的日期,请使用LocalDate类。
  • 您要解析的格式yyyy-MM-dd是ISO8601。现代类将ISO 8601解析为默认格式,即没有任何显式格式化程序。
  • 无论您使用Date还是LocalDate,它们都没有格式或语言环境。它们只是以与int保留没有任何格式或区域设置的数字相同的方式保留数据。无论您使用的是intDate还是LocalDate,如果要使用特定格式,则只能在String中使用该格式。
  • 要为语言环境中的受众设置日期格式,请使用内置的日期格式。 DateTimeFormatter.ofLocalizedDate给您一个,但您需要将其转换为所需的语言环境。

问题:我可以在Android上使用java.time吗?

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

  • 在Java 8和更高版本以及较新的Android设备上(我被告知,从API级别26开始),内置了现代API。
  • 在Java 6和7中,获得ThreeTen Backport,即新类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 2 :(得分:0)

简单的Date返回一个val dateString = dateFormat.format(dateInSpanish) 对象,该对象与格式无关。您要做的是打印以下内容:

if (isset($_GET['logout'])) {
session_destroy();
sesion_write_close();
header("Location: login.php");
exit(); 
}

答案 3 :(得分:0)

尝试将其用于日期表示和本地西班牙时间,请使用localSpanish val

 Calendar c = Calendar.getInstance();
 SimpleDateFormat df = new SimpleDateFormat("yyyy MMM dd - HH:mm:ss",*your code here*);
 String formattedDate = df.format(c.getTime());

答案 4 :(得分:0)

该行:
val dateInSpanish = dateFormat.parse("2017-01-29")
不格式化日期,它只是从字符串中提取日期  
线路:

val localeSpanish = Locale("es", "ES")

不更改手机的配置
所以你有个约会:dateInSpanish 然后您可以根据需要设置其格式,然后打印