├── static └── .gitkeep ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── .gitignore ├── .editorconfig ├── .postcssrc.js ├── .babelrc ├── src ├── main.js ├── app.vue ├── calendar.js └── calendar.vue ├── index.html ├── LICENSE ├── package.json └── README.md /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"' 6 | }) 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserlist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { "modules": false }], 4 | "stage-2" 5 | ], 6 | "plugins": ["transform-runtime"], 7 | "env": { 8 | "test": { 9 | "presets": ["env", "stage-2"], 10 | "plugins": [ "istanbul" ] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './app' 5 | 6 | Vue.config.productionTip = false 7 | 8 | /* eslint-disable no-new */ 9 | new Vue({ 10 | el: '#app', 11 | template: '', 12 | components: { App } 13 | }) 14 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | vue-calendar 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Zee Kim 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | // see http://vuejs-templates.github.io/webpack for documentation. 2 | var path = require('path') 3 | 4 | module.exports = { 5 | build: { 6 | env: require('./prod.env'), 7 | index: path.resolve(__dirname, '../dist/index.html'), 8 | assetsRoot: path.resolve(__dirname, '../dist'), 9 | assetsSubDirectory: 'static', 10 | assetsPublicPath: '', 11 | productionSourceMap: true, 12 | // Gzip off by default as many popular static hosts such as 13 | // Surge or Netlify already gzip all static assets for you. 14 | // Before setting to `true`, make sure to: 15 | // npm install --save-dev compression-webpack-plugin 16 | productionGzip: false, 17 | productionGzipExtensions: ['js', 'css'], 18 | // Run the build command with an extra argument to 19 | // View the bundle analyzer report after build finishes: 20 | // `npm run build --report` 21 | // Set to `true` or `false` to always turn it on or off 22 | bundleAnalyzerReport: process.env.npm_config_report 23 | }, 24 | dev: { 25 | env: require('./dev.env'), 26 | port: 666, 27 | autoOpenBrowser: true, 28 | assetsSubDirectory: 'static', 29 | assetsPublicPath: '', 30 | proxyTable: {}, 31 | // CSS Sourcemaps off by default because relative paths are "buggy" 32 | // with this option, according to the CSS-Loader README 33 | // (https://github.com/webpack/css-loader#sourcemaps) 34 | // In our experience, they generally work as expected, 35 | // just be aware of this issue when enabling this option. 36 | cssSourceMap: false 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-calendar", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "ZEE.KIM <129@jinzhe.net>", 6 | "private": true, 7 | "main": "./src/calendar.vue", 8 | "scripts": { 9 | "dev": "node build/dev-server.js", 10 | "start": "node build/dev-server.js", 11 | "build": "node build/build.js" 12 | }, 13 | "dependencies": { 14 | "vue": "^2.3.3" 15 | }, 16 | "devDependencies": { 17 | "autoprefixer": "^6.7.2", 18 | "babel-core": "^6.22.1", 19 | "babel-loader": "^6.2.10", 20 | "babel-plugin-transform-runtime": "^6.22.0", 21 | "babel-preset-env": "^1.3.2", 22 | "babel-preset-stage-2": "^6.22.0", 23 | "babel-register": "^6.22.0", 24 | "chalk": "^1.1.3", 25 | "connect-history-api-fallback": "^1.3.0", 26 | "copy-webpack-plugin": "^4.0.1", 27 | "css-loader": "^0.28.0", 28 | "eventsource-polyfill": "^0.9.6", 29 | "express": "^4.14.1", 30 | "extract-text-webpack-plugin": "^2.0.0", 31 | "file-loader": "^0.11.1", 32 | "friendly-errors-webpack-plugin": "^1.1.3", 33 | "html-webpack-plugin": "^2.28.0", 34 | "http-proxy-middleware": "^0.17.3", 35 | "webpack-bundle-analyzer": "^2.2.1", 36 | "semver": "^5.3.0", 37 | "shelljs": "^0.7.6", 38 | "opn": "^4.0.2", 39 | "optimize-css-assets-webpack-plugin": "^1.3.0", 40 | "ora": "^1.2.0", 41 | "rimraf": "^2.6.0", 42 | "url-loader": "^0.5.8", 43 | "vue-loader": "^12.1.0", 44 | "vue-style-loader": "^3.0.1", 45 | "vue-template-compiler": "^2.3.3", 46 | "webpack": "^2.6.1", 47 | "webpack-dev-middleware": "^1.10.0", 48 | "webpack-hot-middleware": "^2.18.0", 49 | "webpack-merge": "^4.1.0" 50 | }, 51 | "engines": { 52 | "node": ">= 4.0.0", 53 | "npm": ">= 3.0.0" 54 | }, 55 | "browserslist": [ 56 | "> 1%", 57 | "last 2 versions", 58 | "not ie <= 8" 59 | ] 60 | } 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue Calendar 2 | 3 | > A calendar components for Vue.js. 4 | 5 | ![](http://ww1.sinaimg.cn/large/823603acgy1fh120p4bigg20b50c1wq4.gif) 6 | 7 | 8 | ### Live Demo 9 | > http://jinzhe.github.io/vue-calendar/ 10 | 11 | ### Getting Started 12 | 13 | ``` html 14 | 52 | 53 | 137 | 138 | 252 | 253 | ``` 254 | ### Props 255 | 256 | - :value Array default:[] * default value for calendar 257 | - :begin Array default:[] * limit begin select date 258 | - :end Array default:[] * limit end select date 259 | - :range Bool default:false * You can select a time period 260 | - :zero Bool default:false * Date zero 261 | - :lunar Bool default:false * Show Chinese Lunar 262 | - :weeks Array * According to the system language changes or custom 263 | - :months Array * According to the system language changes or custom 264 | - :events Object * Customize calendar events 265 | 266 | ### Features 267 | - You can limit the start and end dates. 268 | - Customize week and month headlines. 269 | - Support show Chinese lunar calendar, Chinese festivals, international festivals 270 | - Support for custom presentation. 271 | - Support multiple choice 272 | - Customize calendar events 273 | 274 | ### Build Setup 275 | 276 | ``` bash 277 | # install dependencies 278 | npm install 279 | 280 | # serve with hot reload at localhost:666 281 | npm run dev 282 | 283 | # build for production with minification 284 | npm run build 285 | ``` -------------------------------------------------------------------------------- /src/app.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | 196 | 197 | 312 | -------------------------------------------------------------------------------- /src/calendar.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @1900-2100区间内的公历、农历互转 3 | * @charset UTF-8 4 | * @Author Jea杨(JJonline@JJonline.Cn) 5 | * @Time 2014-7-21 6 | * @Time 2016-8-13 Fixed 2033hex、Attribution Annals 7 | * @Time 2016-9-25 Fixed lunar LeapMonth Param Bug 8 | * @Version 1.0.2 9 | * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] 10 | * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] 11 | */ 12 | var calendar = { 13 | 14 | /** 15 | * 农历1900-2100的润大小信息表 16 | * @Array Of Property 17 | * @return Hex 18 | */ 19 | lunarInfo:[0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-1909 20 | 0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-1919 21 | 0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-1929 22 | 0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-1939 23 | 0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-1949 24 | 0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-1959 25 | 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-1969 26 | 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-1979 27 | 0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-1989 28 | 0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-1999 29 | 0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-2009 30 | 0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-2019 31 | 0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-2029 32 | 0x05aa0,0x076a3,0x096d0,0x04afb,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-2039 33 | 0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-2049 34 | /**Add By JJonline@JJonline.Cn**/ 35 | 0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-2059 36 | 0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-2069 37 | 0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-2079 38 | 0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-2089 39 | 0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-2099 40 | 0x0d520],//2100 41 | 42 | /** 43 | * 公历每个月份的天数普通表 44 | * @Array Of Property 45 | * @return Number 46 | */ 47 | solarMonth:[31,28,31,30,31,30,31,31,30,31,30,31], 48 | 49 | /** 50 | * 天干地支之天干速查表 51 | * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] 52 | * @return Cn string 53 | */ 54 | Gan:["\u7532","\u4e59","\u4e19","\u4e01","\u620a","\u5df1","\u5e9a","\u8f9b","\u58ec","\u7678"], 55 | 56 | /** 57 | * 天干地支之地支速查表 58 | * @Array Of Property 59 | * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] 60 | * @return Cn string 61 | */ 62 | Zhi:["\u5b50","\u4e11","\u5bc5","\u536f","\u8fb0","\u5df3","\u5348","\u672a","\u7533","\u9149","\u620c","\u4ea5"], 63 | 64 | /** 65 | * 天干地支之地支速查表<=>生肖 66 | * @Array Of Property 67 | * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] 68 | * @return Cn string 69 | */ 70 | Animals:["\u9f20","\u725b","\u864e","\u5154","\u9f99","\u86c7","\u9a6c","\u7f8a","\u7334","\u9e21","\u72d7","\u732a"], 71 | 72 | /** 73 | * 24节气速查表 74 | * @Array Of Property 75 | * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] 76 | * @return Cn string 77 | */ 78 | solarTerm:["\u5c0f\u5bd2","\u5927\u5bd2","\u7acb\u6625","\u96e8\u6c34","\u60ca\u86f0","\u6625\u5206","\u6e05\u660e","\u8c37\u96e8","\u7acb\u590f","\u5c0f\u6ee1","\u8292\u79cd","\u590f\u81f3","\u5c0f\u6691","\u5927\u6691","\u7acb\u79cb","\u5904\u6691","\u767d\u9732","\u79cb\u5206","\u5bd2\u9732","\u971c\u964d","\u7acb\u51ac","\u5c0f\u96ea","\u5927\u96ea","\u51ac\u81f3"], 79 | 80 | /** 81 | * 1900-2100各年的24节气日期速查表 82 | * @Array Of Property 83 | * @return 0x string For splice 84 | */ 85 | sTermInfo:['9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf97c3598082c95f8c965cc920f', 86 | '97bd0b06bdb0722c965ce1cfcc920f','b027097bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', 87 | '97bcf97c359801ec95f8c965cc920f','97bd0b06bdb0722c965ce1cfcc920f','b027097bd097c36b0b6fc9274c91aa', 88 | '97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f','97bd0b06bdb0722c965ce1cfcc920f', 89 | 'b027097bd097c36b0b6fc9274c91aa','9778397bd19801ec9210c965cc920e','97b6b97bd19801ec95f8c965cc920f', 90 | '97bd09801d98082c95f8e1cfcc920f','97bd097bd097c36b0b6fc9210c8dc2','9778397bd197c36c9210c9274c91aa', 91 | '97b6b97bd19801ec95f8c965cc920e','97bd09801d98082c95f8e1cfcc920f','97bd097bd097c36b0b6fc9210c8dc2', 92 | '9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec95f8c965cc920e','97bcf97c3598082c95f8e1cfcc920f', 93 | '97bd097bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec9210c965cc920e', 94 | '97bcf97c3598082c95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', 95 | '97b6b97bd19801ec9210c965cc920e','97bcf97c3598082c95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722', 96 | '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f', 97 | '97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', 98 | '97bcf97c359801ec95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', 99 | '97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f','97bd097bd07f595b0b6fc920fb0722', 100 | '9778397bd097c36b0b6fc9210c8dc2','9778397bd19801ec9210c9274c920e','97b6b97bd19801ec95f8c965cc920f', 101 | '97bd07f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c920e', 102 | '97b6b97bd19801ec95f8c965cc920f','97bd07f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2', 103 | '9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec9210c965cc920e','97bd07f1487f595b0b0bc920fb0722', 104 | '7f0e397bd097c36b0b6fc9210c8dc2','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', 105 | '97bcf7f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', 106 | '97b6b97bd19801ec9210c965cc920e','97bcf7f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', 107 | '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf7f1487f531b0b0bb0b6fb0722', 108 | '7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', 109 | '97bcf7f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', 110 | '97b6b97bd19801ec9210c9274c920e','97bcf7f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', 111 | '9778397bd097c36b0b6fc9210c91aa','97b6b97bd197c36c9210c9274c920e','97bcf7f0e47f531b0b0bb0b6fb0722', 112 | '7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c920e', 113 | '97b6b7f0e47f531b0723b0b6fb0722','7f0e37f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2', 114 | '9778397bd097c36b0b70c9274c91aa','97b6b7f0e47f531b0723b0b6fb0721','7f0e37f1487f595b0b0bb0b6fb0722', 115 | '7f0e397bd097c35b0b6fc9210c8dc2','9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721', 116 | '7f0e27f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', 117 | '97b6b7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', 118 | '9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722', 119 | '7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721', 120 | '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9274c91aa', 121 | '97b6b7f0e47f531b0723b0787b0721','7f0e27f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', 122 | '9778397bd097c36b0b6fc9210c91aa','97b6b7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', 123 | '7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9210c8dc2','977837f0e37f149b0723b0787b0721', 124 | '7f07e7f0e47f531b0723b0b6fb0722','7f0e37f5307f595b0b0bc920fb0722','7f0e397bd097c35b0b6fc9210c8dc2', 125 | '977837f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0721','7f0e37f1487f595b0b0bb0b6fb0722', 126 | '7f0e397bd097c35b0b6fc9210c8dc2','977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', 127 | '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','977837f0e37f14998082b0787b06bd', 128 | '7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', 129 | '977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722', 130 | '7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', 131 | '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14998082b0787b06bd', 132 | '7f07e7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', 133 | '977837f0e37f14998082b0723b06bd','7f07e7f0e37f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', 134 | '7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b0721', 135 | '7f07e7f0e47f531b0723b0b6fb0722','7f0e37f1487f595b0b0bb0b6fb0722','7f0e37f0e37f14898082b0723b02d5', 136 | '7ec967f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0722','7f0e37f1487f531b0b0bb0b6fb0722', 137 | '7f0e37f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', 138 | '7f0e37f1487f531b0b0bb0b6fb0722','7f0e37f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd', 139 | '7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e37f0e37f14898082b072297c35', 140 | '7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722', 141 | '7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f149b0723b0787b0721', 142 | '7f0e27f1487f531b0b0bb0b6fb0722','7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14998082b0723b06bd', 143 | '7f07e7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722','7f0e37f0e366aa89801eb072297c35', 144 | '7ec967f0e37f14998082b0723b06bd','7f07e7f0e37f14998083b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', 145 | '7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14898082b0723b02d5','7f07e7f0e37f14998082b0787b0721', 146 | '7f07e7f0e47f531b0723b0b6fb0722','7f0e36665b66aa89801e9808297c35','665f67f0e37f14898082b0723b02d5', 147 | '7ec967f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0722','7f0e36665b66a449801e9808297c35', 148 | '665f67f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', 149 | '7f0e36665b66a449801e9808297c35','665f67f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd', 150 | '7f07e7f0e47f531b0723b0b6fb0721','7f0e26665b66a449801e9808297c35','665f67f0e37f1489801eb072297c35', 151 | '7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722'], 152 | 153 | /** 154 | * 数字转中文速查表 155 | * @Array Of Property 156 | * @trans ['日','一','二','三','四','五','六','七','八','九','十'] 157 | * @return Cn string 158 | */ 159 | nStr1:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341"], 160 | 161 | /** 162 | * 日期转农历称呼速查表 163 | * @Array Of Property 164 | * @trans ['初','十','廿','卅'] 165 | * @return Cn string 166 | */ 167 | nStr2:["\u521d","\u5341","\u5eff","\u5345"], 168 | 169 | /** 170 | * 月份转农历称呼速查表 171 | * @Array Of Property 172 | * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] 173 | * @return Cn string 174 | */ 175 | nStr3:["\u6b63","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u51ac","\u814a"], 176 | 177 | /** 178 | * 返回农历y年一整年的总天数 179 | * @param lunar Year 180 | * @return Number 181 | * @eg:var count = calendar.lYearDays(1987) ;//count=387 182 | */ 183 | lYearDays:function(y) { 184 | var i, sum = 348; 185 | for(i=0x8000; i>0x8; i>>=1) { sum += (calendar.lunarInfo[y-1900] & i)? 1: 0; } 186 | return(sum+calendar.leapDays(y)); 187 | }, 188 | 189 | /** 190 | * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 191 | * @param lunar Year 192 | * @return Number (0-12) 193 | * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 194 | */ 195 | leapMonth:function(y) { //闰字编码 \u95f0 196 | return(calendar.lunarInfo[y-1900] & 0xf); 197 | }, 198 | 199 | /** 200 | * 返回农历y年闰月的天数 若该年没有闰月则返回0 201 | * @param lunar Year 202 | * @return Number (0、29、30) 203 | * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 204 | */ 205 | leapDays:function(y) { 206 | if(calendar.leapMonth(y)) { 207 | return((calendar.lunarInfo[y-1900] & 0x10000)? 30: 29); 208 | } 209 | return(0); 210 | }, 211 | 212 | /** 213 | * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 214 | * @param lunar Year 215 | * @return Number (-1、29、30) 216 | * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 217 | */ 218 | monthDays:function(y,m) { 219 | if(m>12 || m<1) {return -1}//月份参数从1至12,参数错误返回-1 220 | return( (calendar.lunarInfo[y-1900] & (0x10000>>m))? 30: 29 ); 221 | }, 222 | 223 | /** 224 | * 返回公历(!)y年m月的天数 225 | * @param solar Year 226 | * @return Number (-1、28、29、30、31) 227 | * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 228 | */ 229 | solarDays:function(y,m) { 230 | if(m>12 || m<1) {return -1} //若参数错误 返回-1 231 | var ms = m-1; 232 | if(ms==1) { //2月份的闰平规律测算后确认返回28或29 233 | return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28); 234 | }else { 235 | return(calendar.solarMonth[ms]); 236 | } 237 | }, 238 | 239 | /** 240 | * 农历年份转换为干支纪年 241 | * @param lYear 农历年的年份数 242 | * @return Cn string 243 | */ 244 | toGanZhiYear:function(lYear) { 245 | var ganKey = (lYear - 3) % 10; 246 | var zhiKey = (lYear - 3) % 12; 247 | if(ganKey == 0) ganKey = 10;//如果余数为0则为最后一个天干 248 | if(zhiKey == 0) zhiKey = 12;//如果余数为0则为最后一个地支 249 | return calendar.Gan[ganKey-1] + calendar.Zhi[zhiKey-1]; 250 | 251 | }, 252 | 253 | /** 254 | * 公历月、日判断所属星座 255 | * @param cMonth [description] 256 | * @param cDay [description] 257 | * @return Cn string 258 | */ 259 | toAstro:function(cMonth,cDay) { 260 | var s = "\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf"; 261 | var arr = [20,19,21,21,21,22,23,23,23,23,22,22]; 262 | return s.substr(cMonth*2 - (cDay < arr[cMonth-1] ? 2 : 0),2) + "\u5ea7";//座 263 | }, 264 | 265 | /** 266 | * 传入offset偏移量返回干支 267 | * @param offset 相对甲子的偏移量 268 | * @return Cn string 269 | */ 270 | toGanZhi:function(offset) { 271 | return calendar.Gan[offset%10] + calendar.Zhi[offset%12]; 272 | }, 273 | 274 | /** 275 | * 传入公历(!)y年获得该年第n个节气的公历日期 276 | * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 277 | * @return day Number 278 | * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 279 | */ 280 | getTerm:function(y,n) { 281 | if(y<1900 || y>2100) {return -1;} 282 | if(n<1 || n>24) {return -1;} 283 | var _table = calendar.sTermInfo[y-1900]; 284 | var _info = [ 285 | parseInt('0x'+_table.substr(0,5)).toString() , 286 | parseInt('0x'+_table.substr(5,5)).toString(), 287 | parseInt('0x'+_table.substr(10,5)).toString(), 288 | parseInt('0x'+_table.substr(15,5)).toString(), 289 | parseInt('0x'+_table.substr(20,5)).toString(), 290 | parseInt('0x'+_table.substr(25,5)).toString() 291 | ]; 292 | var _calday = [ 293 | _info[0].substr(0,1), 294 | _info[0].substr(1,2), 295 | _info[0].substr(3,1), 296 | _info[0].substr(4,2), 297 | 298 | _info[1].substr(0,1), 299 | _info[1].substr(1,2), 300 | _info[1].substr(3,1), 301 | _info[1].substr(4,2), 302 | 303 | _info[2].substr(0,1), 304 | _info[2].substr(1,2), 305 | _info[2].substr(3,1), 306 | _info[2].substr(4,2), 307 | 308 | _info[3].substr(0,1), 309 | _info[3].substr(1,2), 310 | _info[3].substr(3,1), 311 | _info[3].substr(4,2), 312 | 313 | _info[4].substr(0,1), 314 | _info[4].substr(1,2), 315 | _info[4].substr(3,1), 316 | _info[4].substr(4,2), 317 | 318 | _info[5].substr(0,1), 319 | _info[5].substr(1,2), 320 | _info[5].substr(3,1), 321 | _info[5].substr(4,2), 322 | ]; 323 | return parseInt(_calday[n-1]); 324 | }, 325 | 326 | /** 327 | * 传入农历数字月份返回汉语通俗表示法 328 | * @param lunar month 329 | * @return Cn string 330 | * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' 331 | */ 332 | toChinaMonth:function(m) { // 月 => \u6708 333 | if(m>12 || m<1) {return -1} //若参数错误 返回-1 334 | var s = calendar.nStr3[m-1]; 335 | s+= "\u6708";//加上月字 336 | return s; 337 | }, 338 | 339 | /** 340 | * 传入农历日期数字返回汉字表示法 341 | * @param lunar day 342 | * @return Cn string 343 | * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' 344 | */ 345 | toChinaDay:function(d){ //日 => \u65e5 346 | var s; 347 | switch (d) { 348 | case 10: 349 | s = '\u521d\u5341'; break; 350 | case 20: 351 | s = '\u4e8c\u5341'; break; 352 | break; 353 | case 30: 354 | s = '\u4e09\u5341'; break; 355 | break; 356 | default : 357 | s = calendar.nStr2[Math.floor(d/10)]; 358 | s += calendar.nStr1[d%10]; 359 | } 360 | return(s); 361 | }, 362 | 363 | /** 364 | * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” 365 | * @param y year 366 | * @return Cn string 367 | * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' 368 | */ 369 | getAnimal: function(y) { 370 | return calendar.Animals[(y - 4) % 12] 371 | }, 372 | 373 | /** 374 | * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON 375 | * @param y solar year 376 | * @param m solar month 377 | * @param d solar day 378 | * @return JSON object 379 | * @eg:console.log(calendar.solar2lunar(1987,11,01)); 380 | */ 381 | solar2lunar:function (y,m,d) { //参数区间1900.1.31~2100.12.31 382 | if(y<1900 || y>2100) {return -1;}//年份限定、上限 383 | if(y==1900&&m==1&&d<31) {return -1;}//下限 384 | if(!y) { //未传参 获得当天 385 | var objDate = new Date(); 386 | }else { 387 | var objDate = new Date(y,parseInt(m)-1,d) 388 | } 389 | var i, leap=0, temp=0; 390 | //修正ymd参数 391 | var y = objDate.getFullYear(),m = objDate.getMonth()+1,d = objDate.getDate(); 392 | var offset = (Date.UTC(objDate.getFullYear(),objDate.getMonth(),objDate.getDate()) - Date.UTC(1900,0,31))/86400000; 393 | for(i=1900; i<2101 && offset>0; i++) { temp=calendar.lYearDays(i); offset-=temp; } 394 | if(offset<0) { offset+=temp; i--; } 395 | 396 | //是否今天 397 | var isTodayObj = new Date(),isToday=false; 398 | if(isTodayObj.getFullYear()==y && isTodayObj.getMonth()+1==m && isTodayObj.getDate()==d) { 399 | isToday = true; 400 | } 401 | //星期几 402 | var nWeek = objDate.getDay(),cWeek = calendar.nStr1[nWeek]; 403 | if(nWeek==0) {nWeek =7;}//数字表示周几顺应天朝周一开始的惯例 404 | //农历年 405 | var year = i; 406 | 407 | var leap = calendar.leapMonth(i); //闰哪个月 408 | var isLeap = false; 409 | 410 | //效验闰月 411 | for(i=1; i<13 && offset>0; i++) { 412 | //闰月 413 | if(leap>0 && i==(leap+1) && isLeap==false){ 414 | --i; 415 | isLeap = true; temp = calendar.leapDays(year); //计算农历闰月天数 416 | } 417 | else{ 418 | temp = calendar.monthDays(year, i);//计算农历普通月天数 419 | } 420 | //解除闰月 421 | if(isLeap==true && i==(leap+1)) { isLeap = false; } 422 | offset -= temp; 423 | } 424 | 425 | if(offset==0 && leap>0 && i==leap+1) 426 | if(isLeap){ 427 | isLeap = false; 428 | }else{ 429 | isLeap = true; --i; 430 | } 431 | if(offset<0){ offset += temp; --i; } 432 | //农历月 433 | var month = i; 434 | //农历日 435 | var day = offset + 1; 436 | 437 | //天干地支处理 438 | var sm = m-1; 439 | var gzY = calendar.toGanZhiYear(year); 440 | 441 | //月柱 1900年1月小寒以前为 丙子月(60进制12) 442 | var firstNode = calendar.getTerm(year,(m*2-1));//返回当月「节」为几日开始 443 | var secondNode = calendar.getTerm(year,(m*2));//返回当月「节」为几日开始 444 | 445 | //依据12节气修正干支月 446 | var gzM = calendar.toGanZhi((y-1900)*12+m+11); 447 | if(d>=firstNode) { 448 | gzM = calendar.toGanZhi((y-1900)*12+m+12); 449 | } 450 | 451 | //传入的日期的节气与否 452 | var isTerm = false; 453 | var Term = null; 454 | if(firstNode==d) { 455 | isTerm = true; 456 | Term = calendar.solarTerm[m*2-2]; 457 | } 458 | if(secondNode==d) { 459 | isTerm = true; 460 | Term = calendar.solarTerm[m*2-1]; 461 | } 462 | //日柱 当月一日与 1900/1/1 相差天数 463 | var dayCyclical = Date.UTC(y,sm,1,0,0,0,0)/86400000+25567+10; 464 | var gzD = calendar.toGanZhi(dayCyclical+d-1); 465 | //该日期所属的星座 466 | var astro = calendar.toAstro(m,d); 467 | 468 | return {'lYear':year,'lMonth':month,'lDay':day,'Animal':calendar.getAnimal(year),'IMonthCn':(isLeap?"\u95f0":'')+calendar.toChinaMonth(month),'IDayCn':calendar.toChinaDay(day),'cYear':y,'cMonth':m,'cDay':d,'gzYear':gzY,'gzMonth':gzM,'gzDay':gzD,'isToday':isToday,'isLeap':isLeap,'nWeek':nWeek,'ncWeek':"\u661f\u671f"+cWeek,'isTerm':isTerm,'Term':Term,'astro':astro}; 469 | }, 470 | 471 | /** 472 | * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON 473 | * @param y lunar year 474 | * @param m lunar month 475 | * @param d lunar day 476 | * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] 477 | * @return JSON object 478 | * @eg:console.log(calendar.lunar2solar(1987,9,10)); 479 | */ 480 | lunar2solar:function(y,m,d,isLeapMonth) { //参数区间1900.1.31~2100.12.1 481 | var isLeapMonth = !!isLeapMonth; 482 | var leapOffset = 0; 483 | var leapMonth = calendar.leapMonth(y); 484 | var leapDay = calendar.leapDays(y); 485 | if(isLeapMonth&&(leapMonth!=m)) {return -1;}//传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 486 | if(y==2100&&m==12&&d>1 || y==1900&&m==1&&d<31) {return -1;}//超出了最大极限值 487 | var day = calendar.monthDays(y,m); 488 | var _day = day; 489 | //bugFix 2016-9-25 490 | //if month is leap, _day use leapDays method 491 | if(isLeapMonth) { 492 | _day = calendar.leapDays(y,m); 493 | } 494 | if(y < 1900 || y > 2100 || d > _day) {return -1;}//参数合法性效验 495 | 496 | //计算农历的时间差 497 | var offset = 0; 498 | for(var i=1900;i0) { 506 | offset+=calendar.leapDays(y);isAdd = true; 507 | } 508 | } 509 | offset+=calendar.monthDays(y,i); 510 | } 511 | //转换闰月农历 需补充该年闰月的前一个月的时差 512 | if(isLeapMonth) {offset+=day;} 513 | //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) 514 | var stmap = Date.UTC(1900,1,30,0,0,0); 515 | var calObj = new Date((offset+d-31)*86400000+stmap); 516 | var cY = calObj.getUTCFullYear(); 517 | var cM = calObj.getUTCMonth()+1; 518 | var cD = calObj.getUTCDate(); 519 | 520 | return calendar.solar2lunar(cY,cM,cD); 521 | } 522 | }; 523 | 524 | export default calendar -------------------------------------------------------------------------------- /src/calendar.vue: -------------------------------------------------------------------------------- 1 | 2 | 213 | 214 | 268 | 269 | 810 | --------------------------------------------------------------------------------