php 本周开始时间和结束时间;本月开始时间结束时间;上月开始时间结束时间

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
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
 
/**
 
 * 功能:取得给定日期所在周的开始日期和结束日期
 
 * 参数:$gdate 日期,默认为当天,格式:YYYY-MM-DD
 
 *      $first 一周以星期一还是星期天开始,0为星期天,1为星期一
 
 * 返回:数组array("开始日期", "结束日期");
 
 *
 
 */
 
function aweek($gdate = "", $first = 0){
 
 if(!$gdate) $gdate = date("Y-m-d");
 
 $w = date("w", strtotime($gdate));//取得一周的第几天,星期天开始0-6
 
 $dn = $w ? $w - $first : 6;//要减去的天数
 
 //本周开始日期
 
 $st = date("Y-m-d", strtotime("$gdate -".$dn." days"));
 
 //本周结束日期
 
 $en = date("Y-m-d", strtotime("$st +6 days"));
 
 //上周开始日期
 
 $last_st = date('Y-m-d',strtotime("$st - 7 days"));
 
 //上周结束日期
 
 $last_en = date('Y-m-d',strtotime("$st - 1 days"));
 
 return array($st, $en,$last_st,$last_en);//返回开始和结束日期
 
}
 
echo implode("|", aweek("", 1)).'<br />';
 
//echo date("Y-m-d",strtotime("time()"));
 
echo '本周第一天(星期日为一周开始):'.date('Y-m-d', time()-86400*date('w')).'<br/>';
 
echo '本周第一天(星期一为一周开始):'.date('Y-m-d', time()-86400*date('w')+(date('w')>0?86400:-6*86400)).'<br/>';
 
echo '本月第一天:'.date('Y-m-d', mktime(0,0,0,date('m'),1,date('Y'))).'<br/>';
 
echo '本月最后一天:'.date('Y-m-d', mktime(0,0,0,date('m'),date('t'),date('Y'))).'<br/>';
 
//上个月的开始日期
 
$m = date('Y-m-d', mktime(0,0,0,date('m')-1,1,date('Y')));
 
//上个月共多少天
 
$t = date('t',strtotime("$m"));
 
echo '上月第一天:'.date('Y-m-d', mktime(0,0,0,date('m')-1,1,date('Y'))).'<br/>';
 
echo '上月最后一天:'.date('Y-m-d', mktime(0,0,0,date('m')-1,$t,date('Y'))).'<br/>';
 
?>
 
PHP手册上有一个这个方法,用来返回指定日期的周一和周日
 
<?php
function get_week_range($week, $year)
{
    $timestamp = mktime(1,0,0,1,1,$year);
    $firstday = date("N",$timestamp);
    if($firstday >4)
        $firstweek = strtotime('+'.(8-$firstday).' days', $timestamp);
    else
        $firstweek = strtotime('-'.($firstday-1).' days', $timestamp);
     
    $monday = strtotime('+'.($week - 1).' week', $firstweek);
    $sunday = strtotime('+6 days', $monday);
     
    $start = date("Y-m-d", $monday);
    $end   = date("Y-m-d", $sunday);
     
    return array($start, $end);
}
?>
 
strtotime获取本周第一天和最后一天方法的BUG
 
PHP手册上有一个这个方法,用来返回指定日期的周一和周日
 
<?php
function get_week_range($week, $year)
{
    $timestamp = mktime(1,0,0,1,1,$year);
    $firstday = date("N",$timestamp);
    if($firstday >4)
        $firstweek = strtotime('+'.(8-$firstday).' days', $timestamp);
    else
        $firstweek = strtotime('-'.($firstday-1).' days', $timestamp);
     
    $monday = strtotime('+'.($week - 1).' week', $firstweek);
    $sunday = strtotime('+6 days', $monday);
     
    $start = date("Y-m-d", $monday);
    $end   = date("Y-m-d", $sunday);
     
    return array($start, $end);
}
?>
 
但在跨年的时候使用会有问题
 
例如2009年的12月31日周四和2010年1月1日周五周拿到的周一和周日完全不同
 
2009年12月31日拿合到的周一和周日分别对应
 
2009-12-28
2010-01-03
 
但2010年1月1日拿 到的周一和周日分别对应
 
2011-01-03
2011-01-09
 
原因为传进去的方法的周为第53周,但是年为2010年,所以认为2010的第53周,所以计算有误,解决方法为,如果周为大于10(因为一月个月不可能有10周),且月份为1的时候,将年减1处理
 
if(date('m',$last_week_time) == '01' and $tmp_last_week > 10)
{
 $last_week_year--;
}

  

posted @   jshaibozhong  阅读(1042)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示