date.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. var Moment = require("moment.js");
  2. var DATE_LIST = [];
  3. var DATE_YEAR = new Date().getFullYear();
  4. var DATE_MONTH = new Date().getMonth() + 1;
  5. var DATE_DAY = new Date().getDate();
  6. Page({
  7. data: {
  8. maxMonth: 6, //最多渲染月数
  9. dateList: [],
  10. systemInfo: {},
  11. weekStr: ['日', '一', '二', '三', '四', '五', '六'],
  12. checkInDate: Moment(new Date()).format('YYYY-MM-DD'),
  13. markcheckInDate: false, //标记开始时间是否已经选择
  14. sFtv: [{
  15. month: 1,
  16. day: 1,
  17. name: "元旦"
  18. },
  19. {
  20. month: 2,
  21. day: 14,
  22. name: "情人节"
  23. },
  24. {
  25. month: 3,
  26. day: 8,
  27. name: "妇女节"
  28. },
  29. {
  30. month: 3,
  31. day: 12,
  32. name: "植树节"
  33. },
  34. {
  35. month: 3,
  36. day: 15,
  37. name: "消费者权益日"
  38. },
  39. {
  40. month: 4,
  41. day: 1,
  42. name: "愚人节"
  43. },
  44. {
  45. month: 5,
  46. day: 1,
  47. name: "劳动节"
  48. },
  49. {
  50. month: 5,
  51. day: 4,
  52. name: "青年节"
  53. },
  54. {
  55. month: 5,
  56. day: 12,
  57. name: "护士节"
  58. },
  59. {
  60. month: 6,
  61. day: 1,
  62. name: "儿童节"
  63. },
  64. {
  65. month: 7,
  66. day: 1,
  67. name: "建党节"
  68. },
  69. {
  70. month: 8,
  71. day: 1,
  72. name: "建军节"
  73. },
  74. {
  75. month: 9,
  76. day: 10,
  77. name: "教师节"
  78. },
  79. {
  80. month: 9,
  81. day: 28,
  82. name: "孔子诞辰"
  83. },
  84. {
  85. month: 10,
  86. day: 1,
  87. name: "国庆节"
  88. },
  89. {
  90. month: 10,
  91. day: 6,
  92. name: "老人节"
  93. },
  94. {
  95. month: 10,
  96. day: 24,
  97. name: "联合国日"
  98. },
  99. {
  100. month: 12,
  101. day: 24,
  102. name: "平安夜"
  103. },
  104. {
  105. month: 12,
  106. day: 25,
  107. name: "圣诞节"
  108. }
  109. ]
  110. },
  111. onLoad: function(options) {
  112. // 页面初始化 options为页面跳转所带来的参数
  113. this.createDateListData();
  114. var _this = this;
  115. // 页面初始化 options为页面跳转所带来的参数
  116. var checkInDate = options.checkInDate ? options.checkInDate : Moment(new Date()).format('YYYY-MM-DD');
  117. wx.getSystemInfo({
  118. success: function(res) {
  119. _this.setData({
  120. systemInfo: res,
  121. checkInDate: checkInDate
  122. });
  123. }
  124. })
  125. },
  126. onReady: function() {
  127. // 页面渲染完成
  128. },
  129. onShow: function() {
  130. this.selectDataMarkLine()
  131. },
  132. onHide: function() {
  133. // 页面隐藏
  134. },
  135. onUnload: function() {
  136. // 页面关闭
  137. },
  138. //选择的入住与离店时间段
  139. selectDataMarkLine: function() {
  140. let dateList = this.data.dateList;
  141. // let { checkInDate } = wx.getStorageSync("ROOM_SOURCE_DATE");
  142. let checkInDate = '2020-02-26'
  143. let curreInid = checkInDate.substr(0, 4) + "-" + (checkInDate.substr(5, 2) < 10 ? checkInDate.substr(6, 1) : checkInDate.substr(5, 2)); //选择入住的id
  144. let dayIn = checkInDate.substr(8, 2) >= 10 ? checkInDate.substr(8, 2) : checkInDate.substr(9, 1); //选择入住的天id
  145. let monthIn = checkInDate.substr(5, 2) >= 10 ? checkInDate.substr(5, 2) : checkInDate.substr(6, 1); //选择入店的月id
  146. if (curreInid) { //入住与离店是当月的情况
  147. for (let i = 0; i < dateList.length; i++) {
  148. if (dateList[i].id == curreInid) {
  149. let days = dateList[i].days;
  150. for (let k = 0; k < days.length; k++) {
  151. if (days[k].day >= dayIn) {
  152. days[k].class = days[k].class + ' bgitem';
  153. }
  154. if (days[k].day == dayIn) {
  155. days[k].class = days[k].class + ' active';
  156. days[k].inday = true;
  157. }
  158. }
  159. }
  160. }
  161. } else { //跨月
  162. for (let j = 0; j < dateList.length; j++) {
  163. if (dateList[j].month == monthIn) { //入住的开始月份
  164. let days = dateList[j].days;
  165. for (let k = 0; k < days.length; k++) {
  166. if (days[k].day == dayIn) {
  167. days[k].class = days[k].class + ' active';
  168. days[k].inday = true;
  169. }
  170. }
  171. } else { //入住跨月月份
  172. if (dateList[j].month < monthOut && dateList[j].month > monthIn) { //离店中间的月份
  173. let days = dateList[j].days;
  174. for (let k = 0; k < days.length; k++) {
  175. days[k].class = days[k].class + ' bgitem';
  176. }
  177. } else if (dateList[j].month == monthOut) { //离店最后的月份
  178. let days = dateList[j].days;
  179. for (let k = 0; k < days.length; k++) {
  180. }
  181. }
  182. }
  183. }
  184. }
  185. this.setData({
  186. dateList: dateList
  187. })
  188. },
  189. createDateListData: function() {
  190. var dateList = [];
  191. var now = new Date();
  192. /*
  193. 设置日期为 年-月-01,否则可能会出现跨月的问题
  194. 比如:2017-01-31为now ,月份直接+1(now.setMonth(now.getMonth()+1)),则会直接跳到跳到2017-03-03月份.
  195. 原因是由于2月份没有31号,顺推下去变成了了03-03
  196. */
  197. now = new Date(now.getFullYear(), now.getMonth(), 1);
  198. for (var i = 0 - this.data.maxMonth; i <= 0; i++) {
  199. var momentDate = Moment(now).add(this.data.maxMonth - (this.data.maxMonth - i), 'month').date;
  200. var year = momentDate.getFullYear();
  201. var month = momentDate.getMonth() + 1;
  202. var days = [];
  203. var totalDay = this.getTotalDayByMonth(year, month);
  204. var week = this.getWeek(year, month, 1);
  205. //-week是为了使当月第一天的日期可以正确的显示到对应的周几位置上,比如星期三(week = 2),
  206. //则当月的1号是从列的第三个位置开始渲染的,前面会占用-2,-1,0的位置,从1开正常渲染
  207. for (var j = -week + 1; j <= totalDay; j++) {
  208. var tempWeek = -1;
  209. if (j > 0)
  210. tempWeek = this.getWeek(year, month, j);
  211. var clazz = '';
  212. if (tempWeek == 0 || tempWeek == 6)
  213. clazz = 'week'
  214. if (j < DATE_DAY && year == DATE_YEAR && month == DATE_MONTH)
  215. //当天之前的日期不可用
  216. clazz = 'unavailable ' + clazz;
  217. else
  218. clazz = '' + clazz
  219. days.push({
  220. day: j,
  221. class: clazz
  222. })
  223. }
  224. var dateItem = {
  225. id: year + '-' + month,
  226. year: year,
  227. month: month,
  228. days: days
  229. }
  230. dateList.push(dateItem);
  231. }
  232. var sFtv = this.data.sFtv;
  233. for (let i = 0; i < dateList.length; i++) { //加入公历节日
  234. for (let k = 0; k < sFtv.length; k++) {
  235. if (dateList[i].month == sFtv[k].month) {
  236. let days = dateList[i].days;
  237. for (let j = 0; j < days.length; j++) {
  238. if (days[j].day == sFtv[k].day) {
  239. days[j].daytext = sFtv[k].name
  240. }
  241. }
  242. }
  243. }
  244. }
  245. this.setData({
  246. dateList: dateList
  247. });
  248. DATE_LIST = dateList;
  249. },
  250. /*
  251. * 获取月的总天数
  252. */
  253. getTotalDayByMonth: function(year, month) {
  254. month = parseInt(month, 10);
  255. var d = new Date(year, month, 0);
  256. return d.getDate();
  257. },
  258. /*
  259. * 获取月的第一天是星期几
  260. */
  261. getWeek: function(year, month, day) {
  262. var d = new Date(year, month - 1, day);
  263. return d.getDay();
  264. },
  265. /**
  266. * 点击日期事件
  267. */
  268. onPressDate: function(e) {
  269. var {
  270. year,
  271. month,
  272. day
  273. } = e.currentTarget.dataset;
  274. //当前选择的日期为同一个月并小于今天,或者点击了空白处(即day<0),不执行
  275. if ((day < DATE_DAY && month == DATE_MONTH) || day <= 0) return;
  276. var tempMonth = month;
  277. var tempDay = day;
  278. if (month < 10) tempMonth = '0' + month
  279. if (day < 10) tempDay = '0' + day
  280. var date = year + '-' + tempMonth + '-' + tempDay;
  281. this.setData({
  282. checkInDate: date,
  283. markcheckInDate: true,
  284. dateList: DATE_LIST.concat()
  285. });
  286. //设缓存,返回页面时,可在onShow时获取缓存起来的日期
  287. wx.setStorage({
  288. key: 'ROOM_SOURCE_DATE',
  289. data: {
  290. checkInDate: this.data.checkInDate
  291. }
  292. });
  293. wx.navigateBack({
  294. delta: 1, // 回退前 delta(默认为1) 页面
  295. });
  296. this.renderPressStyle(year, month, day);
  297. },
  298. renderPressStyle: function(year, month, day) {
  299. var dateList = this.data.dateList;
  300. //渲染点击样式
  301. for (var i = 0; i < dateList.length; i++) {
  302. var dateItem = dateList[i];
  303. var id = dateItem.id;
  304. if (id === year + '-' + month) {
  305. var days = dateItem.days;
  306. for (var j = 0; j < days.length; j++) {
  307. var tempDay = days[j].day;
  308. if (tempDay == day) {
  309. days[j].class = days[j].class + ' active';
  310. days[j].inday = true;
  311. break;
  312. }
  313. }
  314. break;
  315. }
  316. }
  317. this.setData({
  318. dateList: dateList
  319. });
  320. }
  321. })