func (j *Job) Month(n int) *Job {
	if n < 1 || n > 12 {
		panic(ErrRangeMonth)
	}
	j.Sched[Month] = n
	return j
}
Month method set Month key for job sched.
package scheduler
import (
	"crypto/md5"
	"errors"
	"fmt"
	"io"
	"reflect"
	"sync"
	"time"
)
const (
	Delay = "Delay"
	Every = "Every"
	Second  = "Second"
	Minute  = "Minute"
	Hour    = "Hour"
	Day     = "Day"
	Weekday = "Weekday"
	Month   = "Month"
	EveryRune = -1
)
var (
	defaultJobSetSize = 5000
	maxJobSetSize = 10000
	ErrPendingJob = errors.New("pending job not exist")
	ErrOverlength = errors.New("job set size overlength")
	ErrJobType = errors.New("job type not exist")
	ErrJobSched = errors.New("job sched not exist")
	ErrTimeNegative = errors.New("time argument can not be negative")
	ErrDupJobID = errors.New("Duplicate job id")
	ErrAlreadyComplayed = errors.New("Job hash been completed")
	ErrCancelJob = errors.New("cancel job failed")
	ErrRangeSecond = errors.New("argument 0 <= n <= 59 in Second method")
	ErrRangeMinute = errors.New("argument 0 <= n <= 59 in Minute method")
	ErrRangeHour = errors.New("argument 0 <= n <= 23 in Hour method")
	ErrRangeDay = errors.New("argument 1 <= n <= 31 in Day method")
	ErrRangeWeekday = errors.New("argument 0 <= n <= 6 in Weekday method")
	ErrRangeMonth = errors.New("argument 1 <= n <= 12 in Month method")
	EmptyJobType = ""
	EmptySched = map[string]int{}
	jobSet = &JobSet{
		lock:         new(sync.Mutex),
		pendingSet:   map[string]*Job{},
		completedSet: map[string]bool{},
	}
)
type JobSet struct {
	lock         *sync.Mutex      
	pendingSet   map[string]*Job  
	completedSet map[string]bool  
}
func (js *JobSet) setJobDone(id string) {
	js.lock.Lock()
	defer js.lock.Unlock()
	job := js.pendingSet[id]
	if job.Type != Every {
		if _, ok := js.completedSet[id]; ok {
			panic(ErrDupJobID)
		}
		delete(js.pendingSet, id)
		js.completedSet[id] = true
	}
}
type JobTimer struct {
	ID    string       
	timer *time.Timer  
}
type JobTicker struct {
	ID     string        
	ticker *time.Ticker  
}
type Job struct {
	ID   string  
	Type string  
	Sched map[string]int
	fn      interface{}    
	args    []interface{}  
	JTimer  *JobTimer      
	JTicker *JobTicker     
}
func (j *Job) Second(n int) *Job {
	if n < 0 || n > 59 {
		panic(ErrRangeSecond)
	}
	j.Sched[Second] = n
	return j
}
func (j *Job) Minute(n int) *Job {
	if n < 0 || n > 59 {
		panic(ErrRangeMinute)
	}
	j.Sched[Minute] = n
	return j
}
func (j *Job) Hour(n int) *Job {
	if n < 0 || n > 23 {
		panic(ErrRangeHour)
	}
	j.Sched[Hour] = n
	return j
}
func (j *Job) Day(n int) *Job {
	if n < 1 || n > 31 {
		panic(ErrRangeDay)
	}
	j.Sched[Day] = n
	return j
}
func (j *Job) Weekday(n int) *Job {
	if n < 0 || n > 6 {
		panic(ErrRangeWeekday)
	}
	j.Sched[Weekday] = n
	return j
}