草庐IT

elmentUI组建中el-date-picker实现限制时间范围精确到小时

小炮兵快跑 2024-04-10 原文

elmentUI组建中el-date-picker实现限制时间范围精确到小时

需求要求

  1. 时间选择器只能选择今天之前的日期.默认时间是前一天00点~23点
  2. 后台返回的最小时间和最大时间
  3. 时间精度限制到小时
    开始想着用type="datetimerange"来实现,后来发现控制时间禁用无法实现,后改变思路使用两个type="datetime"拼装

实现

1.先获取一个只能选择到小时的时间范围选择器

css代码

<el-date-picker
            v-model="validity1"
            type="datetime"
            value-format="yyyy-MM-dd HH"
            format="yyyy/MM/dd HH"
            class="datepicker-content"
            :picker-options="datapickerOptions1"
            popper-class="datepickerPopperClass"
            @change="changeDatetime"
            placeholder="起始时间"
            :clearable="false"
          >
          </el-date-picker>
          ~
          <el-date-picker
            v-model="validity2"
            type="datetime"
            value-format="yyyy-MM-dd HH"
            format="yyyy/MM/dd HH"
            class="datepicker-content"
            popper-class="datepickerPopperClass"
            :picker-options="datapickerOptions2"
            placeholder="结束时间"
            :disabled="!validity1"
            :clearable="false"
          >
          </el-date-picker>

如何实现精度到小时,使选择器只能选择到时间(如图)

通过修改css样式实现代码,隐藏分秒结构

.datepickerPopperClass{
  .el-button--text{
    display: none;  //删除时间弹框中此刻按钮(根据需求决定是否保留)
  }
  .el-time-spinner__wrapper{
    width:100%;
  }
  .el-scrollbar:nth-child(2){
    display: none;
  }
}

这样结构上就有一个只能选择到小时的时间范围选择器,这里结束时间在没有选择开始时间时是禁用的

2.通过picker-options属性来控制时间可选日期范围

其中disabledDate属性值来控制选择的日期范围,selectableRange属性值控制可选择的小时范围
vue中data中声明的变量

data() {
    return {
      validity1:'',
      selectableRange1:"00:00:00 - 23:59:59",
      validity2:"",
      selectableRange2:"00:00:00 - 23:59:59",
      startTime:"",   //从后台获取的库表生成时间,之前的时间不能选择,这个值可以根据你需求中的时间来赋值
      endTime:"",      //数据库结束时间
      datapickerOptions1: {
        //设置不能选择的日期
        selectableRange: this.selectableRange1,
        disabledDate: (time) => {
          //获取当前时间
          let nowDate = new Date();
          const oneHour = 1 * 3600 * 1000; //一个小时
          let defaultTime = this.formatDate(nowDate.getTime()-oneHour,"yyyy-MM-dd hh")
          let startTime = this.startTime.split(' ')[0]+" 00:00:00" 
          defaultTime = defaultTime + ":59:59"
          return time.getTime() > new Date(defaultTime)||time.getTime() < new Date(startTime);
        },
      },
      datapickerOptions2: {
        //设置不能选择的日期
        selectableRange: this.selectableRange2,
        disabledDate: (time) => {
          //获取当前时间
          let nowDate = new Date();
          const oneHour = 1 * 3600 * 1000; //一个小时
          let defaultTime = this.formatDate(nowDate.getTime()-oneHour,"yyyy-MM-dd hh")
          let validityTime = this.validity1.split(' ')[0]+" 00:00:00"
          defaultTime = defaultTime + ":59:59"
          return time.getTime() > new Date(defaultTime)||time.getTime() < new Date(validityTime);
        },
      },
    };
  },

通过watch来监控起始时间和结束时间,日期选择后,相应的小时选择范围也会变化

watch:{
    validity1: {
      // date-picker控件点x清空之后默认会重置为null,监听设置为["",""]
      handler(newVal) {
        if (newVal) {
          // console.log("newVal",newVal)
          // console.log(this.startTime)
          if(new Date(newVal+":00:00").getTime()<new Date(this.startTime).getTime()){
            this.validity1 = this.formatDate(this.startTime.split(' ')[0],"yyyy-MM-dd") + " " + this.startTime.split(' ')[1].split(':')[0]+":00"
            // console.log("validity1",this.validity1)
          }
          let rangeStart = ""
          let rangeEnd = ""
          //如果选择的日期是后台库表初始日期
          if(this.startTime){
            if(newVal.split(' ')[0]==this.formatDate(this.startTime.split(' ')[0],"yyyy-MM-dd")){
              rangeStart = this.startTime.split(' ')[1]
            }else{
              rangeStart = "00:00:00"
            }
          }else{
            rangeStart = "00:00:00"
          }
          if(this.endTime){
            if(newVal.split(' ')[0]==this.formatDate(this.endTime.split(' ')[0],"yyyy-MM-dd")){
              rangeEnd = this.endTime.split(' ')[1]
            }else{
              rangeEnd = "23:59:59"
            }
          }else{
            rangeEnd = "23:59:59"
          }
          this.selectableRange1 = rangeStart + " - " + rangeEnd
          this.$set(this.datapickerOptions1,"selectableRange",this.selectableRange1)
        }
      },
      immediate: true,
      deep: true,
    },
    validity2: {
      // date-picker控件点x清空之后默认会重置为null,监听设置为["",""]
      handler(newVal) {
        if (newVal) {
          // console.log("newVal",newVal)
           if(new Date(newVal).getTime()<new Date(this.validity1).getTime()){
            this.validity2 = this.validity1.split(':')[0]+ ":59"
          }
          let rangeStart = ""
          let rangeEnd = ""
          //如果选择的日期是后台库表初始日期
          if(new Date(newVal.split(' ')[0]).getTime()==new Date(this.validity1.split(' ')[0]).getTime()){
            rangeStart = this.validity1.split(' ')[1].split(':')[0] + ":59:59"
          }else{
            this.selectableRange2 = "00:59:59"
          }
          if(this.endTime){
            if(newVal.split(' ')[0]==this.formatDate(this.endTime.split(' ')[0],"yyyy-MM-dd")){
              rangeEnd = this.endTime.split(' ')[1]
            }else{
              rangeEnd = "23:59:59"
            }
          }else{
            rangeEnd = "23:59:59"
          }
          this.selectableRange2 = rangeStart + " - " + rangeEnd
          this.$set(this.datapickerOptions2,"selectableRange",this.selectableRange2)
        }
      },
      immediate: true,
      deep: true,
    },
  },

其中用到的时间格式化方法formatDate

filters: {
    formatDate: function(time) {
      if (time != null && time != "") {
        var date = new Date(time);
        return formatTimeToStr(date, "yyyy/MM/dd hh:mm:ss");
      } else {
        return "";
      }
    },
  },

date.js

export function formatTimeToStr(times, pattern) {
    var d = new Date(times).Format("yyyy-MM-dd hh:mm:ss");
    if (pattern) {
        d = new Date(times).Format(pattern);
    }
    return d.toLocaleString();
}

起始时间选择后,结束时间才可以显示同时结束时间清空

changeDatetime(){
    this.validity2 = ""
   },

希望对你有帮助

有关elmentUI组建中el-date-picker实现限制时间范围精确到小时的更多相关文章

  1. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  4. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  5. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  9. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  10. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

随机推荐