日历周结束天数

时间:2019-05-30 05:52:49

标签: java android datetime calendar timezone

我正在获取日历实例

import java.io.BufferedReader;;
import java.io.FileReader;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

    /**
     * Use {@link StringBuilder} to convert a `Character` list to {@code String}.
     */
    public static String charactersToString(java.util.List<Character> chars)
    {
        StringBuilder sb = new StringBuilder(chars.size());
        for (Character c : chars) {
            sb.append(c.charValue());
        }
        return sb.toString();
    }

    /**
     * Use {@link Stream} to convert {@code String} to a list of {@code chars}.
     */
    public static java.util.List<Character> stringToCharacters(String text) {
        return text.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
    }

    public static void main(String[] args)
    {
        java.io.File file = new java.io.File("file.txt");
        java.util.List<String> content = new java.util.ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader(file)))
        {
            String line;
            while ((line = br.readLine()) != null)
            {
                /* Convert String to Character array so that
                 * it can be easily processed each char at a time
                 */
                java.util.List<Character> chars = stringToCharacters(line);
                /*
                 * Check if ascii value of char matches ESC
                 */
                chars.removeIf(c -> (int)c == 27);
                /*
                 * Add the processed line to a list that will later
                 * be used to write back to the same file
                 */
                content.add(charactersToString(chars));
            }
            /* 
             * Write all processed lines back to the same file
             */
            java.nio.file.Files.write(file.toPath(), content);
        }
        catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
}

在一部手机中,星期六显示为周末,而在另一部手机中,星期日显示为周末 两台设备的时区相同

如果我将日历实例的语言环境设置为美国或任何其他国家/地区,则效果很好。 但是我不希望它保持不变。我希望它是区域性的,但在所有设备上都保持一致

如果时区相同,我希望两台设备上的周末相同

3 个答案:

答案 0 :(得分:2)

一周的第一天(因此也是最后一天)因地区而异(而不是时区或GMT偏移量)。语言环境可以定义国家或地区和/或语言。语言无关(至少通常不相关),但国家/地区无关。例如巴基斯坦:

    WeekFields wf = WeekFields.of(Locale.forLanguageTag("ur-PK"));
    System.out.println("Last day of week is " + wf.getFirstDayOfWeek().plus(6));

输出为:

  

一周的最后一天是星期六

或者阿拉伯联合酋长国,因为您提到了海湾(我假设是波斯湾):

    WeekFields wf = WeekFields.of(Locale.forLanguageTag("ar-AE"));
  

一周的最后一天是星期五

要使用默认语言环境,请指定Locale.getDefault()

    WeekFields wf = WeekFields.of(Locale.getDefault());

由于我的语言环境是丹麦(欧洲),所以我现在得到Last day of week is SUNDAY

我正在使用Java.time(现代Java日期和时间API)的WeekFields类。您正在使用的Calendar类的设计很差,而且已经过时,现代API提供了更丰富的功能。

发生了什么事?

关于您所观察到的行为的可能解释包括:

  • 您的两个设备的国家/地区设置不同。我认为这可能是解释。您尚未告诉我们每个设备的国家/地区设置。
  • 在至少一台设备上,JVM不遵守设备区域设置。可以使用与基础系统不同的语言环境设置来启动JVM(不是我知道如何在Android上做到这一点)。也可以通过Locale.setDefault方法之一动态地更改JVM的语言环境设置。
  • 您的设备的Android版本之间的区域设置数据已更改,因此对于所涉及的国家/地区,一台设备认为该日期是从星期日开始,另一台设备则认为是星期一。语言环境数据一直在更新。

为了进一步解决此问题,我将从在每个设备上输出Locale.getDefault().getDisplayCountry()开始。

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

是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

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

链接

答案 1 :(得分:1)

您可以尝试类似的事情。

Calendar sundayFirst = Calendar.getInstance();
sundayFirst.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);

答案 2 :(得分:0)

您可以尝试

Calendar.getInstance().setFirstDayOfWeek(Calendar.SUNDAY);