diff --git a/components/meetingTimePicker/meetingTimePicker.acss b/components/meetingTimePicker/meetingTimePicker.acss
new file mode 100644
index 0000000..1cc96e7
--- /dev/null
+++ b/components/meetingTimePicker/meetingTimePicker.acss
@@ -0,0 +1,83 @@
+picker-view {
+    background: rgb(255, 255, 255);
+    display: flex;
+}
+
+picker-view .column {
+    font-size: 34rpx;
+    color: #191F25;
+}
+
+.column-1 {
+    flex: 1;
+}
+
+.column-2 {
+    flex: 2;
+}
+
+.tab {
+    margin-top: 72rpx;
+    display: flex;
+    border-bottom: 2rpx solid rgba(25, 31, 37, 0.12);
+    border-top: 2rpx solid rgba(25, 31, 37, 0.12);
+}
+
+.tab>view {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    padding: 16rpx 34rpx;
+}
+
+.tab>view>text {
+    color: rgba(27, 38, 61, 0.49);
+    font-size: 28rpx;
+}
+
+.tab>view>text:nth-of-type(2) {
+    color: #1B263D;
+    font-size: 34rpx;
+    font-weight: bold;
+    line-height: 48rpx;
+}
+
+.tab .active {
+    background: #3296FA;
+}
+
+.tab .active>text {
+    color: rgba(255, 255, 255, 0.8);
+}
+
+.tab>.active>text:nth-of-type(2) {
+    color: #fff;
+}
+
+.coustom-end {
+    height: 144rpx;
+    position: relative;
+    border-bottom: 2rpx solid rgba(25, 31, 37, 0.12);
+}
+
+.coustom-end>text {
+    color: #3070F2;
+    position: absolute;
+    font-size: 24rpx;
+    right: 32rpx;
+    top: 22rpx;
+}
+
+.coustom-end .error {
+    left: 32rpx;
+    right: auto;
+    color: red;
+}
+
+.picker-complete {
+    position: absolute;
+    color: #3070F2;
+    font-size: 32rpx;
+    right: 32rpx;
+    top: 32rpx;
+}
\ No newline at end of file
diff --git a/components/meetingTimePicker/meetingTimePicker.axml b/components/meetingTimePicker/meetingTimePicker.axml
new file mode 100644
index 0000000..a29e170
--- /dev/null
+++ b/components/meetingTimePicker/meetingTimePicker.axml
@@ -0,0 +1,43 @@
+<view class="picker-complete" onTap='complete'>完成</view>
+<view class="tab">
+  <view class="{{currentTab == 'start' ? 'active' : ''}}" id='start' onTap="changeTab">
+    <text>开始时间</text>
+    <text>{{startTime}}</text>
+    <text>{{startWeekDay}}</text>
+  </view>
+  <view class="{{currentTab == 'end' ? 'active' : ''}}" id='end' onTap="changeTab">
+    <block a:if="{{!isEndTimeCustom}}">
+      <text>持续时间</text>
+      <text>{{duration}}</text>
+      <text>结束至{{durationEndTime}}</text>
+    </block>
+    <block a:else>
+      <text>结束时间</text>
+      <text>{{endTime}}</text>
+      <text>{{endWeekDay}}</text>
+    </block>
+  </view>
+</view>
+<view class='coustom-end'>
+  <text class="error">{{error}}</text>
+  <text onTap="changeWay" a:if="{{!isEndTimeCustom}}">自定义结束时间</text></view>
+<view class="picker-area">
+  <picker-view style="height: {{ 34 * visibleItemCount }}px" value="{{pickValue}}" onChange="onChange">
+    <block a:if="{{currentTab == 'end' && !isEndTimeCustom}}">
+      <picker-view-column>
+        <view class="column" key={"{item.value}}" a:for="{{durationList}}">{{item.label}}</view>
+      </picker-view-column>
+    </block>
+    <block a:else>
+      <picker-view-column class="column-2">
+        <view class="column" key="{{item}}" a:for="{{timeData}}">{{item.slice(5)}}</view>
+      </picker-view-column>
+      <picker-view-column class="column-1">
+        <view class="column" key="{{item}}" a:for="{{timeHour}}">{{item}}</view>
+      </picker-view-column>
+      <picker-view-column class="column-1">
+        <view class="column" key="{{item}}" a:for="{{timeMin}}">{{item}}</view>
+      </picker-view-column>
+    </block>
+  </picker-view>
+</view>
\ No newline at end of file
diff --git a/components/meetingTimePicker/meetingTimePicker.js b/components/meetingTimePicker/meetingTimePicker.js
new file mode 100644
index 0000000..c6d759a
--- /dev/null
+++ b/components/meetingTimePicker/meetingTimePicker.js
@@ -0,0 +1,298 @@
+var currentDate = new Date();
+const weekList = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
+const durationList = [{ value: 60, label: '1小时' }, { value: 120, label: '2小时' }, { value: 30, label: '30分钟' }];
+const timeData = generateDate(365);
+const timeHour = generateTime(24);
+const timeMin = generateTime(60);
+
+function padZero(val) {
+  return ("00" + val).slice(-2);
+}
+// 生成小时和分钟
+function generateTime(max) {
+  const time = [];
+  for (let i = 0; i < max; i++) {
+    time.push(padZero(i))
+  }
+  return time;
+}
+// 生成年月日周
+function generateDate(max) {
+  const timeData = [];
+  for (let i = max; i > 0; i--) {
+    timeData.push(GetDateStr(-i));
+  }
+  for (let i = 0; i < max; i++) {
+    timeData.push(GetDateStr(i));
+  }
+  return timeData
+}
+function GetDateStr(AddDayCount) {
+  var time = new Date();
+  time.setDate(time.getDate() + AddDayCount);
+  const res = getYMDWHMIN(time);
+  return res.y + '年' + res.m + "月" + res.d + "日 " + res.w;
+}
+// 获取年月日周时分
+function getYMDWHMIN(date) {
+  const y = date.getFullYear();
+  const m = padZero(date.getMonth() + 1);
+  const d = padZero(date.getDate());
+  const w = weekList[date.getDay()];
+  const h = padZero(date.getHours());
+  const min = padZero(date.getMinutes());
+  return {
+    y, m, d, w, h, min
+  }
+}
+// 时间格式转化为03月01日 14:00
+function getTabShowDateByDate(date) {
+  const res = getYMDWHMIN(date);
+  return res.m + "月" + res.d + "日 " + res.h + ':' + res.min;
+}
+function getdhmByPickValue(pickValue) {
+  const d = timeData[pickValue[0]];
+  const h = timeHour[pickValue[1]];
+  const m = timeMin[pickValue[2]];
+  return { d, h, m }
+}
+function getTabShowDateByPickValue(pickValue) {
+  const { d, h, m } = getdhmByPickValue(pickValue);
+  const time = `${d.slice(5, 10)} ${h}:${m}`;
+  const weekDay = d.slice(-2);
+  return { time, weekDay }
+}
+// 根据column值获取标准时间格式 2019/2/2 16:00
+function getPostTimeByPickValue(pickValue) {
+  const { d, h, m } = getdhmByPickValue(pickValue);
+  const newD = d.slice(0, 10).replace('年', '/').replace('月', '/').replace('日', '/');
+  return newD + ' ' + h + ':' + m
+}
+// 将周几转换为今天,明天, 昨天
+function getTabShowWeekByDate(futureData) {
+  const date = new Date(futureData);
+  let week = '今天';
+  //同年同月
+  if (currentDate.getFullYear() == date.getFullYear() &&
+    currentDate.getMonth() == date.getMonth()
+  ) {
+    if (currentDate.getDate() == date.getDate()) {
+      week = '今天'
+    } else if (date.getDate() - currentDate.getDate() == 1) {
+      week = '明天'
+    } else if (currentDate.getDate() - date.getDate() == 1) {
+      week = '昨天'
+    } else {
+      week = weekList[date.getDay()]
+    }
+  } else {
+    week = weekList[date.getDay()]
+  }
+  return week;
+}
+
+// 根据开始时间和持续时间计算结束时间 2019/2/2 16:00
+function getEndTime(startTime, duration) {
+  let newDate = new Date(startTime);
+  var min = newDate.getMinutes();
+  newDate.setMinutes(min + duration);
+  const res = getYMDWHMIN(newDate);
+  return res.y + '/' + res.m + '/' + res.d + ' ' + res.h + ':' + res.min;
+}
+// 获取结束至时间的显示 16:00
+function getDurationEndTime(startTime, duration) {
+  return getEndTime(startTime, duration).slice(-5);
+}
+// 获取持续时间 {value,lable,index}
+function getDuration(startDate, endDate) {
+  const time = endDate.getTime() - startDate.getTime();
+  const min = time / 1000 / 60;
+  let duration = null;
+  durationList.forEach((it, index) => {
+    if (it.value == min) {
+      it.index = index;
+      duration = it
+    }
+  })
+  return duration
+}
+// 根据持续时间的显示值获取实际分钟数
+function getDurationValue(durationLable) {
+  let value = 120;
+  durationList.forEach(it => {
+    if (it.label == durationLable) {
+      value = it.value
+    }
+  });
+  return value
+}
+// 获取时间格式的pick value用于pick column回显
+function getPickerValue(date) {
+  const res = getYMDWHMIN(date);
+  const pickerValue = [timeData.indexOf(res.y + "年" + res.m + "月" + res.d + "日 " + res.w), timeHour.indexOf(res.h), timeMin.indexOf(res.min)];
+  return pickerValue
+}
+Component({
+  mixins: [],
+  data: {
+    currentTab: 'start',
+    timeData: timeData,
+    timeHour: timeHour,
+    timeMin: timeMin,
+    durationList: durationList,
+    isEndTimeCustom: false,
+    //用于pick column回显
+    startPickValue: [],
+    endPickValue: [],
+    endDurationPickValue: [1],
+    // 当前 pick column回显
+    pickValue: [],
+    //开始、结束时间tab数据
+    startWeekDay: '今天',
+    startTime: '',
+    endWeekDay: '今天',
+    endTime: '',
+    //持续结束时间tab数据
+    duration: '2小时',
+    //已选择的标准时间格式数据
+    postStartTime: '',
+    postEndTime: '',
+    durationEndTime: '',
+    error: ''
+  },
+  props: {
+  },
+  didMount() {
+    this.setInitialValue();
+  },
+  didUpdate() {
+  },
+  didUnmount() { },
+  methods: {
+    //设置初始值
+    setInitialValue() {
+      let startDate = new Date();
+      //结束日期默认+2小时
+      let endDate = new Date();
+      var hour = endDate.getHours();
+      endDate.setHours(hour + 2);
+      // 赋值
+      if (this.props.startTime) {
+        startDate = new Data(this.props.startTime);
+      }
+      if (this.props.endTime) {
+        endDate = new Data(thia.props.endTime);
+      }
+      //开始和结束时间,持续时间赋值
+      this.setData({
+        startPickValue: getPickerValue(startDate),
+        startTime: getTabShowDateByDate(startDate),
+        postStartTime: startDate,
+        pickValue: getPickerValue(startDate),
+        endPickValue: getPickerValue(endDate),
+        endTime: getTabShowDateByDate(endDate),
+        postEndTime: endDate
+      });
+      // 如果持续时间不在范围内,需要改变默认显示结束时间的方式
+      const duration = getDuration(startDate, endDate);
+      if (duration) {
+        this.setData({
+          duration: duration.label,
+          durationEndTime: getDurationEndTime(startDate, duration.value),
+          endDurationPickValue: [duration.index]
+        })
+      } else {
+        this.setData({
+          isEndTimeCustom: true
+        })
+      }
+    },
+    onChange(e) {
+      const pickValue = e.detail.value;
+      const timeData = getTabShowDateByPickValue(pickValue);
+      //改变开始时间,改变持续时间的结束时间
+      if (this.data.currentTab === 'start') {
+        const postStartTime = getPostTimeByPickValue(pickValue);
+        this.setData({
+          startTime: timeData.time,
+          startWeekDay: getTabShowWeekByDate(postStartTime),
+          startPickValue: pickValue,
+          postStartTime
+        });
+        if (!this.data.isEndTimeCustom) {
+          this.setData({
+            durationEndTime: getDurationEndTime(postStartTime, getDurationValue(this.data.duration))
+          })
+        }
+      }
+      // 改变结束时间,这里结束时间和持续时间互不影响
+      else if (this.data.currentTab === 'end') {
+        const postEndTime = getPostTimeByPickValue(pickValue);
+        if (this.data.isEndTimeCustom) {
+          this.setData({
+            endTime: timeData.time,
+            endWeekDay: getTabShowWeekByDate(postEndTime),
+            endPickValue: pickValue,
+            postEndTime
+          });
+        } else {
+          const durationData = durationList[pickValue[0]];
+          this.setData({
+            duration: durationData.label,
+            durationEndTime: getDurationEndTime(this.data.postStartTime, durationData.value),
+            endDurationPickValue: pickValue,
+            postEndTime: getEndTime(this.data.postStartTime, durationData.value)
+          });
+        }
+      }
+      this.checkValue(this.data.postStartTime, this.data.postEndTime);
+    },
+    changeTab(e) {
+      const currentTab = e.currentTarget.id;
+      //pick coulum 回显
+      if (currentTab === 'end' && !this.data.isEndTimeCustom) {
+        return this.setData({
+          currentTab,
+          pickValue: this.data.endDurationPickValue
+        });
+      }
+      this.setData({
+        currentTab,
+        pickValue: this.data[`${currentTab}PickValue`]
+      });
+    },
+    changeWay() {
+      this.setData({
+        isEndTimeCustom: true
+      });
+      //如果在end tab 切换, 需要设置结束时间的pick column回显
+      if (this.data.currentTab == 'end') {
+        this.setData({
+          pickValue: this.data.endPickValue
+        });
+      }
+    },
+    checkValue(postStartTime, postEndTime) {
+      if (new Date(postEndTime).getTime() <= new Date(postStartTime).getTime()) {
+        this.setData({
+          error: '开始时间小于结束时间'
+        })
+        return false;
+      } else {
+        this.setData({
+          error: ''
+        })
+        return true
+      }
+    },
+    complete() {
+      const { postStartTime, postEndTime } = this.data;
+      if (this.checkValue(postStartTime, postEndTime)) {
+        this.props.onComplete({
+          startTime: postStartTime,
+          endTime: postEndTime
+        })
+      }
+    }
+  },
+});
diff --git a/components/meetingTimePicker/meetingTimePicker.json b/components/meetingTimePicker/meetingTimePicker.json
new file mode 100644
index 0000000..32640e0
--- /dev/null
+++ b/components/meetingTimePicker/meetingTimePicker.json
@@ -0,0 +1,3 @@
+{
+  "component": true
+}
\ No newline at end of file