├── README.md
├── app.js
├── app.json
├── app.wxss
├── pages
├── detail
│ ├── detail.js
│ ├── detail.json
│ ├── detail.wxml
│ └── detail.wxss
└── index
│ ├── index.js
│ ├── index.json
│ ├── index.wxml
│ └── index.wxss
└── utils
└── util.js
/README.md:
--------------------------------------------------------------------------------
1 | ## laohuangli
2 |
3 | 老黄历微信小程序,支持宜/忌事项查阅。
4 |
5 | ### 预览
6 |
7 | 
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | //app.js
2 | App({
3 | onLaunch: function () {
4 | //调用API从本地缓存中获取数据
5 | // console.log('Launch');
6 | },
7 | globalData:{
8 | appName: '老黄历',
9 | author: 'Mr.Zheng'
10 | },
11 | getDateDetail: function(dateStr, callback) {
12 | var that = this;
13 | var api = 'https://v.juhe.cn/laohuangli/d';
14 | var appKey = '073a2856e9b3187f878ac05baf204d9e';
15 | wx.request({
16 | url: api,
17 | data: {
18 | key: appKey,
19 | date: dateStr
20 | },
21 | header: {
22 | 'Content-Type': 'application/json'
23 | },
24 | success: function(res) {
25 | var data = typeof res === 'string' ? JSON.parse(res) : res;
26 | if (typeof callback === 'function') {
27 | callback.call(that, data);
28 | }
29 | }
30 | });
31 | }
32 | })
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "pages":[
3 | "pages/index/index",
4 | "pages/detail/detail"
5 | ],
6 | "window":{
7 | "backgroundTextStyle":"light",
8 | "navigationBarBackgroundColor": "#fff",
9 | "navigationBarTitleText": "WeChat",
10 | "navigationBarTextStyle":"black"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/app.wxss:
--------------------------------------------------------------------------------
1 | /**app.wxss**/
2 | .container {
3 | position: absolute;
4 | top: 0;
5 | right: 0;
6 | bottom: 0;
7 | left: 0;
8 | box-sizing: border-box;
9 | }
10 |
--------------------------------------------------------------------------------
/pages/detail/detail.js:
--------------------------------------------------------------------------------
1 | // pages/detail/detail.js
2 | var app = getApp();
3 | var utils = require('../../utils/util.js');
4 |
5 | Page({
6 | data:{},
7 | saveData: {},
8 | fetchData: function(date, callback) {
9 | var that = this;
10 | that.saveData.currentDate = date;
11 | wx.showToast({
12 | title: '加载中',
13 | icon: 'loading',
14 | duration: 10000
15 | });
16 | app.getDateDetail(date, function(data) {
17 | var rs;
18 | wx.hideToast();
19 | if (data.statusCode) {
20 | rs = data.data.result;
21 | } else {
22 | rs = {
23 | errMsg: '接口数据请求失败!
稍后再试'
24 | };
25 | }
26 | if (typeof callback === 'function') {
27 | callback.call(that, rs);
28 | }
29 | });
30 | },
31 | onLoad:function(options){
32 | var that = this;
33 | // 页面初始化 options为页面跳转所带来的参数
34 | var dateStr = options['date'] || '1970-0-1';
35 | that.setData({
36 | date: dateStr
37 | });
38 | that.fetchData(dateStr, function(data) {
39 | that.setData(data);
40 | });
41 | },
42 | onReady:function(){
43 | // 页面渲染完成
44 | },
45 | onShow:function(){
46 | // 页面显示
47 | },
48 | onHide:function(){
49 | // 页面隐藏
50 | },
51 | onUnload:function(){
52 | // 页面关闭
53 | },
54 | goPrevDay: function(e) {
55 | var that = this;
56 | var target = e.currentTarget;
57 | var data = target.dataset;
58 | var day = data.day || '1970-01-01';
59 | var date, dateStr;
60 | day = day.replace(/-/g, '/');
61 | date = new Date(day);
62 | date.setDate(date.getDate() - 1);
63 | dateStr = utils.format(date, '{Y}-{M}-{D}');
64 | that.setData({
65 | date: dateStr
66 | });
67 | that.fetchData(dateStr, function(data) {
68 | that.setData(data);
69 | });
70 | },
71 | goNextDay: function(e) {
72 | var that = this;
73 | var target = e.currentTarget;
74 | var data = target.dataset;
75 | var day = data.day || '1970-01-01';
76 | var date, dateStr;
77 | day = day.replace(/-/g, '/');
78 | date = new Date(day);
79 | date.setDate(date.getDate() + 1);
80 | dateStr = utils.format(date, '{Y}-{M}-{D}');
81 | that.setData({
82 | date: dateStr
83 | });
84 | that.fetchData(dateStr, function(data) {
85 | that.setData(data);
86 | });
87 | },
88 | touchStart: function(e) {
89 | var that = this;
90 | var obj = e.changedTouches;
91 | that.saveData.startX = obj[0].pageX;
92 | },
93 | touchEnd: function(e) {
94 | var that = this;
95 | var obj = e.changedTouches;
96 | var endX = obj[0].pageX;
97 | var delta = endX - that.saveData.startX;
98 | var day = that.saveData.currentDate || '1970-01-01';
99 | var date, dateStr;
100 | if (Math.abs(delta) < 50) {
101 | return false;
102 | }
103 | day = day.replace(/-/g, '/');
104 | date = new Date(day);
105 | if (delta < 0) {
106 | date.setDate(date.getDate() + 1);
107 | } else {
108 | date.setDate(date.getDate() - 1);
109 | }
110 | dateStr = utils.format(date, '{Y}-{M}-{D}');
111 | that.saveData.currentDate = dateStr;
112 | that.setData({
113 | date: dateStr
114 | });
115 | that.fetchData(dateStr, function(data) {
116 | that.setData(data);
117 | });
118 | }
119 | });
--------------------------------------------------------------------------------
/pages/detail/detail.json:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/pages/detail/detail.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{errMsg}}
4 |
5 |
6 |
7 |
8 | 宜
9 |
10 | {{yi}}
11 |
12 |
13 |
14 | 忌
15 |
16 | {{ji}}
17 |
18 |
19 |
20 |
27 |
28 |
32 |
33 |
--------------------------------------------------------------------------------
/pages/detail/detail.wxss:
--------------------------------------------------------------------------------
1 | /* pages/detail/detail.wxss */
2 | .header {
3 | height: 50px;
4 | line-height: 50px;
5 | text-align: center;
6 | font-size: 24px;
7 | color: #333;
8 | }
9 |
10 | .header .sub-title {
11 | font-size: 16px;
12 | }
13 |
14 | .table .row {
15 | position: relative;
16 | background-color: #f44;
17 | overflow: hidden;
18 | }
19 |
20 | .table .row-yi {
21 | background-color: #fe4;
22 | }
23 |
24 | .table .row .left {
25 | position: absolute;
26 | top: 0;
27 | bottom: 0;
28 | left: 0;
29 | z-index: 2;
30 | display: flex;
31 | justify-content: center;
32 | align-items: center;
33 | width: 25%;
34 | font-size: 48px;
35 | color: #fff;
36 | }
37 |
38 | .table .row-yi .left {
39 | color: #333;
40 | }
41 |
42 | .table .row .right {
43 | margin-left: 25%;
44 | padding: 20px 15px;
45 | display: flex;
46 | align-items: center;
47 | min-height: 80px;
48 | line-height: 1.432;
49 | box-sizing: border-box;
50 | background-color: #ffddd3;
51 | }
52 |
53 | .table .row-yi .right {
54 | background-color: #ffa;
55 | }
56 |
57 | .footer {
58 | position: absolute;
59 | right: 0;
60 | bottom: 0;
61 | left: 0;
62 | height: 50px;
63 | }
64 |
65 | .footer .c-day {
66 | float: left;
67 | width: 50%;
68 | height: 50px;
69 | line-height: 50px;
70 | text-align: center;
71 | color: #fff;
72 | font-size: 16px;
73 | background-color: #3b9aa0;
74 | border-radius: 0;
75 | box-sizing: border-box;
76 | }
77 |
78 | .footer .c-hover {
79 | background-color: rgba(59, 154, 160, .9);
80 | }
81 |
82 |
83 | .footer .c-day.c-prev {
84 | border-right: 1px solid #fff;
85 | }
86 |
87 | .footer .c-day.c-next {
88 | border-left: 1px solid #fff;
89 | }
--------------------------------------------------------------------------------
/pages/index/index.js:
--------------------------------------------------------------------------------
1 | //index.js
2 | var utils = require('../../utils/util.js');
3 | Page({
4 | data: {
5 | userInfo: {}
6 | },
7 | saveData: {},
8 | //事件处理函数
9 | bindViewTap: function() {
10 | wx.navigateTo({
11 | url: '../detail/detail'
12 | })
13 | },
14 | getTableArray: function(year, month) {
15 | var date = year && month ? new Date(year, month - 1, 1) : new Date();
16 | var dayCount = 0;
17 | var startRow = 0;
18 | var tableArray = [];
19 | var diffStart = 0;
20 | var todayStr = utils.format(new Date(), '{Y}-{M}-{D}');
21 | date.setMonth(date.getMonth() + 1);
22 | date.setDate(0);
23 | dayCount = date.getDate();
24 | date.setDate(1);
25 | diffStart = date.getDay();
26 | for (var i = 1; i <= dayCount; i++) {
27 | if (!utils.isArray(tableArray[startRow])) {
28 | tableArray[startRow] = Array(7);
29 | }
30 | date.setDate(i);
31 | var lunDate = utils.e2c(date.getFullYear(), date.getMonth(), i).day;
32 | var tmpDate = (lunDate < 11) ? '初' : ((lunDate < 20) ? '十' : ((lunDate < 30) ? '廿' : '三十'));
33 | if (lunDate % 10 != 0 || lunDate == 10) {
34 | tmpDate += utils.numString.charAt((lunDate - 1) % 10);
35 | }
36 | var dateStr = utils.format(date, '{Y}-{M}-{D}');
37 | tableArray[startRow][date.getDay()] = {
38 | date: dateStr,
39 | calendar: utils.doubleNumber(i),
40 | lunar: tmpDate,
41 | isToday: dateStr === todayStr
42 | };
43 | if ((i + diffStart) % 7 === 0) {
44 | startRow++;
45 | }
46 | }
47 | return tableArray;
48 | },
49 | getTitle: function(year, month, date) {
50 | // 格式化农历日期
51 | var lunarObj = utils.e2c(year, month, date);
52 | var lunYear = '';
53 | lunYear += utils.tgString.charAt((lunarObj.year - 4) % 10);
54 | lunYear += utils.dzString.charAt((lunarObj.year - 4) % 12);
55 | lunYear += "(";
56 | lunYear += utils.sx.charAt((lunarObj.year - 4) % 12);
57 | lunYear += ")年";
58 | var monStr = utils.format(new Date(year, month, date), '{Y}年{M}月');
59 | var lunMon = lunYear + utils.monString.charAt(lunarObj.month - 1) + '月';
60 | return {
61 | month: monStr,
62 | lunMonth: lunMon
63 | };
64 | },
65 | onLoad: function () {
66 | // console.log('onLoad')
67 | var that = this;
68 | var today = new Date();
69 | var tableArray = [];
70 | var itemHeight = '20%';
71 | var year = today.getFullYear();
72 | var month = today.getMonth();
73 | var date = today.getDate();
74 | var titleObj = this.getTitle(year, month, date);
75 |
76 | tableArray = this.getTableArray(year, month + 1);
77 | itemHeight = 1 / tableArray.length * 100 + '%';
78 |
79 | this.saveData.currentDate = year + '-' + month + '-' + date;
80 |
81 | this.setData({
82 | month: year + '-' + month + '-' + date,
83 | dateTable: tableArray,
84 | itemHeight: itemHeight,
85 | date: {
86 | calendar: titleObj.month,
87 | lunar: titleObj.lunMonth
88 | }
89 | });
90 | //调用应用实例的方法获取全局数据
91 | // app.getDateDetail('2017-01-22', function(data) {
92 | // console.log(data);
93 | // });
94 | },
95 | toDetail: function(e) {
96 | var target = e.currentTarget;
97 | var data = target.dataset;
98 | var date = data.date;
99 | wx.navigateTo({
100 | url: '../detail/detail?date=' + date
101 | });
102 | },
103 | goPrevMonth: function(e) {
104 | var target = e.currentTarget;
105 | var data = target.dataset;
106 | var dm = data.month;
107 | var dArr = dm.split('-');
108 | var y = +dArr[0] || 1970;
109 | var m = +dArr[1] || 0;
110 | var d = +dArr[2] || 1;
111 |
112 | var today;
113 | var tableArray = [];
114 | var itemHeight = '20%';
115 | var year;
116 | var month;
117 | var date;
118 | var titleObj;
119 |
120 | if (m <= 0) {
121 | m = 11;
122 | y -= 1;
123 | } else {
124 | m -= 1;
125 | }
126 | today = new Date(y, m, 1);
127 | year = today.getFullYear();
128 | month = today.getMonth();
129 | date = today.getDate();
130 | titleObj = this.getTitle(year, month, date);
131 |
132 | tableArray = this.getTableArray(year, month + 1);
133 | itemHeight = 1 / tableArray.length * 100 + '%';
134 |
135 | this.saveData.currentDate = year + '-' + month + '-' + date;
136 |
137 | this.setData({
138 | month: year + '-' + month + '-' + date,
139 | dateTable: tableArray,
140 | itemHeight: itemHeight,
141 | date: {
142 | calendar: titleObj.month,
143 | lunar: titleObj.lunMonth
144 | }
145 | });
146 | },
147 | goNextMonth: function(e) {
148 | var target = e.currentTarget;
149 | var data = target.dataset;
150 | var dm = data.month;
151 | var dArr = dm.split('-');
152 | var y = +dArr[0] || 1970;
153 | var m = +dArr[1] || 0;
154 | var d = +dArr[2] || 1;
155 |
156 | var today;
157 | var tableArray = [];
158 | var itemHeight = '20%';
159 | var year;
160 | var month;
161 | var date;
162 | var titleObj;
163 |
164 | if (m >= 11) {
165 | m = 0;
166 | y += 1;
167 | } else {
168 | m += 1;
169 | }
170 | today = new Date(y, m, 1);
171 | year = today.getFullYear();
172 | month = today.getMonth();
173 | date = today.getDate();
174 | titleObj = this.getTitle(year, month, date);
175 |
176 | tableArray = this.getTableArray(year, month + 1);
177 | itemHeight = 1 / tableArray.length * 100 + '%';
178 |
179 | this.saveData.currentDate = year + '-' + month + '-' + date;
180 |
181 | this.setData({
182 | month: year + '-' + month + '-' + date,
183 | dateTable: tableArray,
184 | itemHeight: itemHeight,
185 | date: {
186 | calendar: titleObj.month,
187 | lunar: titleObj.lunMonth
188 | }
189 | });
190 | },
191 | touchStart: function(e) {
192 | var that = this;
193 | var obj = e.changedTouches;
194 | that.saveData.startX = obj[0].pageX;
195 | },
196 | touchEnd: function(e) {
197 | var that = this;
198 | var obj = e.changedTouches;
199 | var endX = obj[0].pageX;
200 | var delta = endX - that.saveData.startX;
201 | var dateStr = that.saveData.currentDate || '1970-0-1';
202 | var dArr = dateStr.split('-');
203 | var y = +dArr[0];
204 | var m = +dArr[1];
205 | var d = +dArr[2];
206 |
207 | var today;
208 | var tableArray = [];
209 | var itemHeight = '20%';
210 | var year;
211 | var month;
212 | var date;
213 | var titleObj;
214 |
215 | if (Math.abs(delta) < 50) {
216 | return false;
217 | }
218 | if (delta < 0) {
219 | if (m >= 11) {
220 | m = 0;
221 | y += 1;
222 | } else {
223 | m += 1;
224 | }
225 | } else {
226 | if (m <= 0) {
227 | m = 11;
228 | y -= 1;
229 | } else {
230 | m -= 1;
231 | }
232 | }
233 | today = new Date(y, m, 1);
234 | year = today.getFullYear();
235 | month = today.getMonth();
236 | date = today.getDate();
237 | titleObj = this.getTitle(year, month, date);
238 |
239 | tableArray = this.getTableArray(year, month + 1);
240 | itemHeight = 1 / tableArray.length * 100 + '%';
241 |
242 | this.saveData.currentDate = year + '-' + month + '-' + date;
243 |
244 | this.setData({
245 | month: year + '-' + month + '-' + date,
246 | dateTable: tableArray,
247 | itemHeight: itemHeight,
248 | date: {
249 | calendar: titleObj.month,
250 | lunar: titleObj.lunMonth
251 | }
252 | });
253 | }
254 | });
255 |
--------------------------------------------------------------------------------
/pages/index/index.json:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/pages/index/index.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 | 日
8 | 一
9 | 二
10 | 三
11 | 四
12 | 五
13 | 六
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | {{day.calendar}}
23 | {{day.lunar}}
24 |
25 |
26 |
27 |
28 | {{day.calendar}}
29 | {{day.lunar}}
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
41 |
42 |
--------------------------------------------------------------------------------
/pages/index/index.wxss:
--------------------------------------------------------------------------------
1 | /**index.wxss**/
2 | .header {
3 | padding-left: 10px;
4 | height: 50px;
5 | line-height: 50px;
6 | font-size: 24px;
7 | }
8 |
9 | .header .lunar {
10 | font-size: 14px;
11 | }
12 |
13 | .weekday {
14 | height: 50px;
15 | color: #fff;
16 | font-size: 16px;
17 | }
18 |
19 | .weekday .day {
20 | float: left;
21 | width: 14.2857%;
22 | line-height: 50px;
23 | text-align: center;
24 | background-color: #3b65a0;
25 | }
26 |
27 | .weekday .day:nth-child(even) {
28 | background-color: #3b9aa0;
29 | }
30 |
31 | .table {
32 | position: absolute;
33 | top: 100px;
34 | bottom: 50px;
35 | left: 0;
36 | width: 100%;
37 | }
38 |
39 | .table .row {
40 | height: 20%;
41 | border-bottom: 1px solid #dedede; /* 3b65a0 */
42 | box-sizing: border-box;
43 | }
44 |
45 | .table .row:last-child {
46 | border-bottom: 0;
47 | }
48 |
49 | .table .row .date {
50 | float: left;
51 | display: flex;
52 | width: 14.2851%;
53 | height: 100%;
54 | justify-content: center;
55 | align-items: center;
56 | box-sizing: border-box;
57 | }
58 |
59 | .table .row .date.today {
60 | background-color: #ffa;
61 | }
62 |
63 | .table .row .date-hover {
64 | background-color: #e0e0e0;
65 | }
66 |
67 | .table .row .date.date-empty {
68 | background-color: #efefef;
69 | }
70 |
71 | .table .row .date:nth-child(odd) {
72 | border-left: 1px solid #dedede; /* 3b65a0 */
73 | border-right: 1px solid #dedede;
74 | }
75 |
76 | .table .cal-date {
77 | display: block;
78 | text-align: center;
79 | font-size: 32px;
80 | color: #666;
81 | }
82 |
83 | .table .lun-date {
84 | display: block;
85 | text-align: center;
86 | font-size: 14px;
87 | color: #999;
88 | }
89 |
90 | .footer {
91 | position: absolute;
92 | right: 0;
93 | bottom: 0;
94 | left: 0;
95 | height: 50px;
96 | }
97 |
98 | .footer .c-month {
99 | float: left;
100 | width: 50%;
101 | height: 50px;
102 | line-height: 50px;
103 | text-align: center;
104 | color: #fff;
105 | font-size: 16px;
106 | background-color: #3b9aa0;
107 | border-radius: 0;
108 | box-sizing: border-box;
109 | }
110 |
111 | .footer .c-hover {
112 | background-color: rgba(59, 154, 160, .9);
113 | }
114 |
115 | .footer .c-month.c-prev {
116 | border-right: 1px solid #fff;
117 | }
118 |
119 | .footer .c-month.c-next {
120 | border-left: 1px solid #fff;
121 | }
--------------------------------------------------------------------------------
/utils/util.js:
--------------------------------------------------------------------------------
1 | var dateTool = {
2 | CalendarData: [
3 | 0x0b557, //1949
4 | 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, //1950-1959
5 | 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, //1960-1969
6 | 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, //1970-1979
7 | 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, //1980-1989
8 | 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, //1990-1999
9 | 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, //2000-2009
10 | 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, //2010-2019
11 | 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, //2020-2029
12 | 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, //2030-2039
13 | 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, //2040-2049
14 | 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, //2050-2059
15 | 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, //2060-2069
16 | 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, //2070-2079
17 | 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, //2080-2089
18 | 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, //2090-2099
19 | 0x0d520 // 2100
20 | ],
21 | madd: [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
22 | tgString: '甲乙丙丁戊己庚辛壬癸',
23 | dzString: '子丑寅卯辰巳午未申酉戌亥',
24 | numString: '一二三四五六七八九十',
25 | monString: '正二三四五六七八九十冬腊',
26 | weekString: '日一二三四五六',
27 | sx: '鼠牛虎兔龙蛇马羊猴鸡狗猪',
28 | // 获取当前日期
29 | now: function (withWeek) {
30 | var d = new Date();
31 | var year = d.getFullYear();
32 | var month = d.getMonth() + 1;
33 | var date = d.getDate();
34 | var week = d.getDay();
35 | var curDateTime = year;
36 | if (month > 9) {
37 | curDateTime = curDateTime + '年' + month;
38 | } else {
39 | curDateTime = curDateTime + '年0' + month;
40 | }
41 | if (date > 9) {
42 | curDateTime = curDateTime + '月' + date + '日';
43 | } else {
44 | curDateTime = curDateTime + '月0' + date + '日';
45 | }
46 | if (withWeek) {
47 | var weekday = '星期' + this.weekString[week];
48 | curDateTime = curDateTime + ' ' + weekday;
49 | }
50 | return curDateTime;
51 | },
52 | lunar: function () {
53 | var D = new Date();
54 | var yy = D.getFullYear();
55 | var mm = D.getMonth() + 1;
56 | var dd = D.getDate();
57 | if (yy < 100) {
58 | yy = '19' + yy;
59 | }
60 | return this.getLunarDay(yy, mm, dd);
61 | },
62 | getLunarDay: function (solarYear, solarMonth, solarDay) {
63 | if (solarYear < 1949 || solarYear > 2100) {
64 | return '';
65 | } else {
66 | solarMonth = (parseInt(solarMonth) > 0) ? (solarMonth - 1) : 11;
67 | this.e2c(solarYear, solarMonth, solarDay);
68 | return this.getcDateString();
69 | }
70 | },
71 | getcDateString: function () {
72 | var tmp = '';
73 | /**
74 | * 显示农历年:(如:甲午(马)年)
75 | */
76 | /*
77 | tmp += this.tgString.charAt((this.cYear - 4) % 10);
78 | tmp += this.dzString.charAt((this.cYear - 4) % 12);
79 | tmp += "(";
80 | tmp += this.sx.charAt((this.cYear - 4) % 12);
81 | tmp += ")年 ";
82 | */
83 | if (this.cMonth < 1) {
84 | tmp += '(闰)';
85 | tmp += this.monString.charAt(-this.cMonth - 1);
86 | } else {
87 | tmp += this.monString.charAt(this.cMonth - 1);
88 | }
89 | tmp += '月';
90 | tmp += (this.cDay < 11) ? '初' : ((this.cDay < 20) ? '十' : ((this.cDay < 30) ? '廿' : '三十'));
91 | if (this.cDay % 10 != 0 || this.cDay == 10) {
92 | tmp += this.numString.charAt((this.cDay - 1) % 10);
93 | }
94 | return tmp;
95 | },
96 | lYearDays: function (y) {
97 | var i, sum = 348;
98 | for (i = 0x8000; i > 0x8; i >>= 1) {
99 | sum += (this.CalendarData[y - 1949] & i) ? 1 : 0;
100 | }
101 | return (sum + this.leapDays(y));
102 | },
103 | leapDays: function (y) {
104 | if (this.leapMonth(y)) {
105 | return ((this.CalendarData[y - 1949] & 0x10000) ? 30 : 29);
106 | }
107 | return (0);
108 | },
109 | leapMonth: function (y) {
110 | return (this.CalendarData[y - 1949] & 0xf);
111 | },
112 | monthDays: function (y, m) {
113 | // 月份参数从1至12,参数错误返回-1
114 | if (m > 12 || m < 1) {
115 | return -1;
116 | }
117 | return ((this.CalendarData[y - 1949] & (0x10000 >> m)) ? 30 : 29);
118 | },
119 | // 农历转换
120 | e2c: function () {
121 | this.theDate = (arguments.length != 3) ? new Date() : new Date(arguments[0], arguments[1], arguments[2]);
122 |
123 | var objDate = this.theDate;
124 | var y = objDate.getFullYear();
125 | var m = objDate.getMonth();
126 | var d = objDate.getDate();
127 | var temp = 0;
128 | var offset = (Date.UTC(y, m, d) - Date.UTC(1949, 0, 31)) / 86400000;
129 | for (i = 1949; i < 2101 && offset > 0; i++) {
130 | temp = this.lYearDays(i);
131 | offset -= temp;
132 | }
133 | if (offset < 0) {
134 | offset += temp;
135 | i--;
136 | }
137 |
138 | this.cYear = i;
139 | var leap = this.leapMonth(i); // 闰哪个月
140 | var isLeap = false;
141 | // 农历月不是闰月
142 | var notLeapMounth = true;
143 |
144 | // 效验闰月
145 | for (var i = 1; i < 13 && offset > 0; i++) {
146 | // 闰月
147 | if (leap > 0 && i == (leap + 1) && isLeap == false) {
148 | --i;
149 | isLeap = true;
150 | notLeapMounth = false;
151 | temp = this.leapDays(this.cYear); // 计算农历闰月天数
152 | } else {
153 | notLeapMounth = true;
154 | temp = this.monthDays(this.cYear, i); // 计算农历普通月天数
155 | }
156 | // 解除闰月
157 | if (isLeap == true && i == (leap + 1)) {
158 | isLeap = false;
159 | }
160 | offset -= temp;
161 | }
162 | // 闰月导致数组下标重叠取反
163 | if (offset == 0 && leap > 0 && i == leap + 1) {
164 | if (isLeap) {
165 | isLeap = false;
166 | } else {
167 | isLeap = true;
168 | --i;
169 | }
170 | }
171 | if (offset < 0) {
172 | offset += temp;
173 | --i;
174 | }
175 | //农历月
176 | this.cMonth = notLeapMounth ? i : -i;
177 | var dayLen = this.monthDays(this.cYear, i);
178 | //农历日
179 | this.cDay = offset + 3 > dayLen ? ((offset + 3) % dayLen) : offset + 3;
180 |
181 | return {
182 | year: this.cYear,
183 | month: this.cMonth,
184 | day: this.cDay
185 | };
186 | },
187 | doubleNumber: function (num) {
188 | return num < 10 ? "0" + num : num;
189 | },
190 | format: function (date, tpl) {
191 | var week = "日一二三四五六";
192 | var Y = date.getFullYear();
193 | var M = this.doubleNumber(date.getMonth() + 1);
194 | var D = this.doubleNumber(date.getDate());
195 | var W = week.charAt(date.getDay());
196 | var h = this.doubleNumber(date.getHours());
197 | var i = this.doubleNumber(date.getMinutes());
198 | var s = this.doubleNumber(date.getSeconds());
199 | return tpl.replace(/\{Y\}/g, Y)
200 | .replace(/\{M\}/g, M)
201 | .replace(/\{D\}/g, D)
202 | .replace(/\{W\}/g, W)
203 | .replace(/\{h\}/g, h)
204 | .replace(/\{i\}/g, i)
205 | .replace(/\{s\}/g, s);
206 | },
207 | isArray: function (arr) {
208 | if (Array.isArray) {
209 | return Array.isArray(arr);
210 | }
211 | return Object.prototype.toString.call(arr) === '[object Array]';
212 | }
213 | };
214 |
215 | module.exports = dateTool;
216 |
--------------------------------------------------------------------------------