在日期格式化时遇到的问题,日期格式化方法在最下面。

 原文

先写主要问题:

显示不同时区的时间

关于Date 时区问题闹得一个小笑话,date时区笑话

先写主要问题:

  Date d = new Date();
  System.out.println(d);

  请在本地开发工具运行以下代码。看看输出时间是否跟你操作系统时间一致,如果不一致,恭喜,以下内容对你有用。

 

时区问题闹得一个小笑话,date时区笑话
先写主要问题: Date d = new Date();System.out.println(d);
请在本地开发工具运行以下代码。看看输…

如果在中国时区 formatDate(‘2019-07-09’) 结果是 ‘2019-07-09’如果
在夏威夷时区 utc-10:00 或者别的时区formatDate(‘2019-07-09’) 结果是
‘2019-07-08’

  1. 正确的做法
       Date d = new Date();
        System.out.println(d);

 

时区不同导致日期格式化结果不同,查看代码发现不同时区 new
Date(str)的结果不同,下面是浏览器测试例子:

以下列出正确的做法:

  请在本地开发工具运行以下代码。看看输出时间是否跟你操作系统时间一致,如果不一致,恭喜,以下内容对你有用。

 
一个日期命令最基本的需求就是显示你所在时区的日期和时间。但是如果你有用户是跨时区的呢?或者,如果你有朋友或是同事时在不同的地区呢?你就会一直搞不清楚那儿现在到底是个什么日子了,比如卡萨布兰卡、梵蒂冈或是悉尼。

时区设置为北京 utc+08:00

var time1 = (timestart+' 00:00:00').toString();
var time2 = (timeend+' 23:59:59').toString();
timestart = new Date(Date.parse(str.replace(/-/g,"/"))).getTime();
timeend = new Date(Date.parse(str.replace(/-/g,"/"))).getTime();

 

var str = '2019-07-09';var str1 = '2019-07-09 13:00:00';console.log(new Date(str));console.log(new Date(str1));VM158:3 Tue Jul 09 2019 08:00:00 GMT+0800 (China Standard Time)VM158:4 Tue Jul 09 2019 13:00:00 GMT+0800 (China Standard Time)

 

 

 
 现在大部分的Unix系统都有一个date命令,它的后台是一个时区数据库。它的位置一般是在目录/usr/share/zoneinfo下,它列出了超过250个不同的地区,并且可以明确表示出各个不同地区的时间。因为date命令注重的是时间变量TZ,该变量可以被设置为不同的已知地区,那么核心的功能可以通过如下表示:

时区设置为夏威夷 utc-10:00

 

TZ=”Africa/Casablanca” date

var str = '2019-07-09';var str1 = '2019-07-09 13:00:00';console.log(new Date(str));console.log(new Date(str1));VM155:3 Mon Jul 08 2019 14:00:00 GMT-1000 (Local Standard Time)VM155:4 Tue Jul 09 2019 13:00:00 GMT-1000 (Local Standard Time)

主要的变化是对默认的日期格式进行了转换,
基于’/’格式的日期字符串,才是被各个浏览器所广泛支持的,‘-’连接的日期字符串,则是只在chrome下可以正常工作。

 
 通过一个shell脚本,我们可以创建一个对用户界面友好的时区数据库:要知道,大部分系统用户并不喜欢临时设置环境变量

解决办法是在方法中添加如下代码

‘2015-05-04’是无法被各个浏览器中,使用new
Date(str)来正确生成日期对象的。 正确的用法是’2015/05/05’.

澳门皇冠金沙网站, 

if (typeof str == 'string'  str.indexOf(':') == -1) { str += ' 00:00:00';}

代码:

感觉解决办法不是太好,如果有更好的办法请大神告知,谢谢

 

//日期格式化方法function formatDate(str, fmt) { if (!str) return ''; fmt = fmt || "yyyy-MM-dd"; //默认只显示年月日 if (this.getIEVersion()  -1) { str = str.replace(/-/g, "/") } //解决问题的代码 if (typeof str == 'string'  str.indexOf(':') == -1) { str += ' 00:00:00'; } var date = new Date(str); var o = { "M+": date.getMonth() + 1, //月 "d+": date.getDate(), //日 "h+": date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, //时 "H+": date.getHours(), //小时 "m+": date.getMinutes(), //分 "s+": date.getSeconds(), //秒 "q+": Math.floor((date.getMonth() + 3) / 3), //季 "S": date.getMilliseconds() //毫秒 }, week = { "0": "\u65e5", "1": "\u4e00", "2": "\u4e8c", "3": "\u4e09", "4": "\u56db", "5": "\u4e94", "6": "\u516d" }; if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)); } if (/(E+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length  1) ? (RegExp.$1.length  2 ? "\u661f\u671f" : "\u5468") : "") + week[date.getDay() + ""]); } for (var k in o) { if (new RegExp("(" + k + ")").test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); } } return fmt;},

01

来自:

#!/bin/sh

02

  

03

 # timein.sh — 显示特定时区或是地区的时间.

04

 # 如果没有提供任何参数,就显示 UTC/GMT.

05

 # 使用单词”list”来查看已知地区列表

06

 # 注意:有可能匹配到地区,但只有时区是合法的。

07

  

08

 # 

09

  

10

 zonedir=”/usr/share/zoneinfo”

11

  

12

 if [ ! -d $zonedir ]; then

13

     echo “No time zone database at $zonedir.” >&2

14

     exit 1

15

 fi

16

  

17

 if [ -d “$zonedir/posix” ]; then

18

     zonedir=$zonedir/posix  # 现代Linux系统

19

 fi

20

  

21

 if [ $# -eq 0 ]; then

22

     timezone=”UTC”

23

     mixedzone=”UTC”

24

 elif [ “$1” = “list” ]; then

25

     (echo “All known time zones and regions defined on this system:”

26

     cd $zonedir

27

     find * -type f -print | xargs -n 2 | \

28

     awk ‘{printf “%-38s %-38s\n”, $1, $2}’   

29

     ) | more

30

     exit 0

31

 else

32

     region=”$(dirname $1)”  # 如果参数格式是
Asia/Beijing,那region是Asia

33

     zone=”$(basename $1)”   # 如果参数格式是 Beijing,那region就是个点

34

  

35

     # 恰好可以匹配?非常好。否则我们需要探索一番。

36

     # 从计算匹配的个数开始。

37

  

38

     matchcnt=”$(find $zonedir/$region -name $zone -type f -print |

39

         wc -l | sed ‘s/[^[:digit:]]//g’)”
 #上面的查找路径,应该加上$region,否则查找的不精确。书中没有。

40

                                            #比如给出形如 Asia/Beijing
的参数,如果路径中没有Asia,那永远也查不到北京

41

  

42

     if [ “$matchcnt” -gt 0 ]; then  # 至少一个文件匹配

43

         if [ “$matchcnt” -gt 1 ]; then  # 超过一个文件匹配

44

             echo “\”$zone\” matches more than one possible time zone
record.” >&2

45

             echo “Please use ‘list’ to see all known regions and time
zones.” >&2

46

             exit 1

47

         fi

48

         match=”$(find $zonedir -name $zone -type f -print)”

49

         mixedzone=”$zone”

50

     else

51

         # 第一个字母大写,其余单词小写: region + zone

52

         mixedregion=”$(echo ${region%${region#?}} | tr
‘[[:lower:]]’ ‘[[:upper:]]’)\

53

 $(echo ${region#?} | tr ‘[[:upper:]]’ ‘[[:lower:]]’)”
 #行头千万别留下空格或者制表符

54

         mixedzone=”$(echo ${zone%${zone#?}} | tr ‘[[:lower:]]’
‘[[:upper:]]’)\

55

 $(echo ${zone#?} | tr ‘[[:upper:]]’ ‘[[:lower:]]’)”  
 #行头千万别留下空格或者制表符

56

  

57

         if [ “$mixedregion” != “.” ]; then

58

             # 只查特定地方

59

             # 当有多种可能性时,让用户指定唯一匹配项(比如”Atlantic”)

60

             match=”$(find $zonedir/$mixedregion -name $mixedzone -type
f -print)”

61

         else

62

             match=”$(find $zonedir -name $mixedzone -type f -print)”

63

         fi

64

  

65

         if [ -z “$match” ]; then

66

             if [ ! -z “$(find $zonedir -name $mixedzone -type d
-print)” ]; then

67

                 echo \

68

                 “The region \”$1\” has more than one time zone.
Please use ‘list'” >&2

69

             else  # 没有一个匹配

70

                 echo “Can’t find an exact match for \”$1\”. Please
use ‘list'” >&2

71

             fi

72

             echo “to see all known regions and time zones.” >&2

73

             exit 1

74

         fi

75

     fi

76

     timezone=”$match”

77

 fi

78

  

79

 nicetz=$(echo $timezone | sed “s|$zonedir/||g”)

80

  

81

 echo It\’s $(TZ=$timezone date ‘+%A, %B %e, %Y, at %l:%M %p’) in
$nicetz

82

  

83

 exit 0

脚本如何工作:

   
这个脚本利用的就是date命令来显示日期和时间。事实上,这整个脚本关注的就是要确认好你给的时区名,这样在脚本的最后才能如期运行好。

这个脚本最复杂的地方来自预测由用户输入的,不匹配时区数据库中的任一个名字的地区名。时区数据库会按照时区名按地区列排好,在有典型的输入问题时,脚本也会试图报有用的错误信息。

   
比如,虽然TZ=”Casablanca”并不嫩成功的查找到一个匹配的地区,而date命令会演示GMT,城市Casablanca确实是存在于地区数据库中的。可能的名字,Africa/Casablanca,就会被提供给这个脚本。脚本会找到非洲目录下的卡萨布兰卡,然后正确的确认这个地区。指定”Africa”,从另一面来说,脚本知道有分区,只提供那些信息不足以唯一指定一个时区。

最后,你同样可以使用一个时区名(比如,UTC、WET)作为脚本参数来查看定义好的时区的子集。

注:UTC是协调世界时(Universal Time
Coordinated)英文缩写,北京时间比UTC时间早8小时。GMT(Greenwich Mean
Time)是格林尼治平时。

 

运行脚本:

 

 

01

./timein.sh

02

 It’s 星期一, 十二月 24, 2012, at 12:19 上午 in UTC

03

  

04

 ./timein.sh London

05

 It’s 星期一, 十二月 24, 2012, at 12:19 上午 in Europe/London

06

  

07

 ./timein.sh Brazil

08

 The region “Brazil” has more than one time zone. Please use ‘list’

09

 to see all known regions and time zones.

10

  

11

 ./timein.sh Pacific/Honolulu

12

 It’s 星期日, 十二月 23, 2012, at 2:21 下午 in Pacific/Honolulu

13

  

14

 ./timein.sh WET

15

 It’s 星期一, 十二月 24, 2012, at 12:21 上午 in WET

16

  

17

 ./timein.sh mycloset

18

 Can’t find an exact match for “mycloset”. Please use ‘list’

19

 to see all known regions and time zones.

 

一个日期命令最基本的需求就是显示你所在时区的日期和时间。但是如果你有用户是跨时区的呢?或者,如果你有朋友…

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图