如何用javascript中的正则判断日期

JavaScript016

如何用javascript中的正则判断日期,第1张

最简单的正则 如 : \d{4}-\d{2}-\d{2} 但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题..... 对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是:0001-01-01 00:00:00到9999-12-31 23:59:59。 UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z。 先考虑与年份无关的前三条规则,年份可统一写作 (?!0000)[0-9]{4} 下面仅考虑月和日的正则 1. 包括平年在内的所有年份的月份都包含1-28日 (0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8]) 2. 包括平年在内的所有年份除2月外都包含29和30日 (0[13-9]|1[0-2])-(29|30) 3. 包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日 (0[13578]|1[02])-31) 合起来就是除闰年的2月29日外的其它所有日期 (?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31) 接下来考虑闰年的实现 1 : 四年一闰 ([0-9]{2}(0[48]|[2468][048]|[13579][26]) 2 : 百年不闰,四百年再闰 (0[48]|[2468][048]|[13579][26])00 3 : 合起来就是所有闰年的2月29日 ([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29) 四条规则都已实现,且互相间没有影响,合起来就是所有符合DateTime范围的日期的正则 ^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$ 考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。 ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

参考资料: http://zhidao.baidu.com/question/125006373.html

一.js将时间转换成时间戳

1.js获取当前时间戳的方法

?

1

2

3

var timestamp1 = Date.parse(new Date())

var timestamp2 = (new Date()).valueOf()

var timestamp3 = new Date().getTime()

第一种:获取的时间戳是把毫秒改成000显示,第二种和第三种是获取了当前毫秒的时间戳。

2.js获取制定时间戳的方法

?

1

2

var oldTime = (new Date("2015/06/23 08:00:20")).getTime()/1000

getTime()返回数值的单位是毫秒。

二.js把时间戳转为为普通日期格式

1.Date toLocaleString方法

?

1

2

3

function getLocalTime(nS) {

return new Date(parseInt(nS) * 1000).toLocaleString().replace(/:\d{1,2}$/,' ')

}

parseInt() 函数可解析一个字符串,并返回一个整数。

js中时间操作单位是毫秒。

toLocaleString() 方法可根据本地时间把 Date 对象转换为字符串,并返回结果。

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

replace(/:\d{1,2}$/,' ')验证替换以:开始有一位或二位数字的结束字符串,就是秒;替换为空

显示如下:

所以我们可以利用正则表达式改变我们想要的日期格式。

2.Date 属性方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

function add0(m){return m<10?'0'+m:m }

function format(shijianchuo)

{

//shijianchuo是整数,否则要parseInt转换

var time = new Date(shijianchuo)

var y = time.getFullYear()

var m = time.getMonth()+1

var d = time.getDate()

var h = time.getHours()

var mm = time.getMinutes()

var s = time.getSeconds()

return y+'-'+add0(m)+'-'+add0(d)+' '+add0(h)+':'+add0(mm)+':'+add0(s)

}

三.封装的时间格式器

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

/**

* 和PHP一样的时间戳格式化函数

* @param {string} format 格式

* @param {int} timestamp 要格式化的时间 默认为当前时间

* @return {string} 格式化的时间字符串

*/

function date(format, timestamp){

var a, jsdate=((timestamp) ? new Date(timestamp*1000) : new Date())

var pad = function(n, c){

if((n = n + "").length <c){

return new Array(++c - n.length).join("0") + n

} else {

return n

var date0= new Date()date0.setFullYear(2000,01,01)

var date1=new Date()

date1.setFullYear(yyyy,MM,dd)

iDays = parseInt(Math.abs(date1 -date0) / 1000 / 60 / 60 /24)

iDays就是相差的天数。