侧边栏壁纸
博主头像
biubiubiu博主等级

刻意练习,每日精进

  • 累计撰写 22 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux用户环境导致的日期格式化问题

wdc
wdc
2023-11-19 / 0 评论 / 0 点赞 / 92 阅读 / 1765 字

最近在项目中遇到一个Linux服务器语言环境的问题,下面来描述一下。

上下文场景

在项目中使用了 SimpleDateFormat 格式化时间,注意 pattern 中的 a,它是上午或者下午的标记。

public static void main(String[] args) {
    Date date = new Date();
    String pattern = "yyyy-MM-dd a HH:mm:ss";
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    System.out.println(sdf.format(date));
}

通过 locale 命令服务器的语言环境如下:

image-20231119195938389

在项目中没有设置默认 locale 时,SimpleDateFormat 会使用系统语言环境来格式化日期

image-20231119201447786

我在项目中并没有手动设置 locale,所以 patterna 的预期结果应该是中文,就像这样:

2023-11-19 下午 20:02:11

可是实际输出的结果却是

2023-11-19 PM 20:17:54

看来是程序没有获取到正确的 locale。

原因

重点来了

sudo -u usersu - user 的区别:

在Linux中,sudo -u usersu - user都可以用来切换用户,但它们的工作方式有所不同。

  • sudo -u user:这个命令允许你以另一个用户的身份执行命令,但是你需要使用当前用户的密码。sudo -u user命令可以让你有选择地执行具有超级用户权限的命令,而不需要完全切换到另一个用户

  • su - user:这个命令会切换到指定的用户,并且会启动一个新的登录shell。这意味着你的工作环境(包括工作目录和环境变量)会被设置为新用户的默认工作环境

我们的项目在启动的时候使用的命令是

sudo -u weblogic ./run.sh

虽然以 weblogic 账号启动了程序,但是使用了执行者本身的语言环境:en_US.UTF-8。所以程序拿到的 locale 是英文,导致格式化后的日期显示不正确。

image-20231119204942232

0

评论区