首页 > 其他分享 >重新学习一下new Date()

重新学习一下new Date()

时间:2023-08-20 21:59:06浏览次数:33  
标签:00 16 重新学习 时间 2023 Date new

new Date()你知道多少

很多小伙伴可能都知道, 
Date是js中的一个内置对象,用于处理日期和时间。
当你调用 new Date() 时,它会创建一个新的日期(Date) 对象。
表示当前本地日期和时间。
那么你知道  new Date() 可以接收几种形式的参数吗?
它的默认返回是什么日期格式?
new Date()可以接收4种形式的参数。

常见的日期格式有几种?

我们经常看见 Wed Aug 16 2023 08:00:00 GMT+0800 (中国标准时间)
这样的时间格式,你知道有几种常见的日期格式吗?
上面这一种又是属于那一种呢?
好了,不卖关子,常见的日期格式有如下这几种:
1.中国标准时间 如:Wed Aug 16 2023 08:00:00 GMT+0800 (中国标准时间)
2.时间戳 1692144000000 单位是毫秒 13位数; 10位数的单位是秒 
  new Date().getTime()返回的就是时间戳  13位数
  今天后端说,他想要一个10位数的时间戳,给我整懵了。
  在我的印象中时间戳不一是13位数的吗?原来是秒的时间戳
3.UTC格式(国际统一时间) 2023-08-16T16:00:00.000Z

new Date()可以接收4种形式的参数

1.不传递参数:如果没有传递任何参数,创建一个表示当前日期和时间的 Date 对象。
2.传递一个正确的日期字符串。 如:
3.传递一个时间戳 毫秒
4.传递 年、月、日、时、分、秒、毫秒的参数
5.传递一个表示时区偏移量的字符

第1种:不传递参数,创建当前当前日期和时间

<script>
  let currentDate = new Date();  
  console.log(currentDate);
  // 表示:当前的日期和时间
  // 输出的是:Wed Aug 16 2023 11:00:34 GMT+0800 (中国标准时间)
</script>

第2种: 传递一个正确的日期字符串

我们可以传递一个正确的日期字符串。
这个字符串是可以被我们的js解析为日期的。
如:"2023-08-16", "2023/08/16",

<script>
  let dateStr = "2023-08-16";  
  let date = new Date(dateStr);  
  console.log(date);
  // 输出:Wed Aug 16 2023 08:00:00 GMT+0800 (中国标准时间)
</script>

第3种:传递一个时间戳 毫秒

<script>
  let timestamp = 1692144000000; // 时间戳  毫秒
  let date = new Date(timestamp);  
  console.log(date); //Wed Aug 16 2023 08:00:00 GMT+0800 (中国标准时间)
</script>

第4种:传递 年、月、日、时、分、秒、毫秒

<script>
  let date = new Date(2023, 7, 16, 14, 30, 45, 417); // 2023年8月16日14时30分45秒417毫秒  
  console.log(date); // 输出:Wed Aug 16 2023 14:30:45 GMT+0800 (中国标准时间)
</script>

我们传递的参数可以是数字或字符串,并且可以有省略。
省略的部分会被设置为对应的最小值或默认值。
如,只提供年份和月份 new Date('2023', 7);  会被解析为 "2023年8月1日 00:00:00"。日期天数解析为1号
如,只提供年份和月份和天  new Date('2023', 7, 16);  会被解析为 "2023年8月16日 00:00:00"。
如,只提供年份和月份和天和小时  new Date('2023', 7, 16, 14);  会被解析为 "2023年8月16日 14:00:00"。

第5种: 传递1个表示时区偏移量的字符

<script>
  let date = new Date("Tue Jun 21 2023 14:40:15 UTC+8");  // 一个表示时区偏移量的字符串
  console.log(date); // 输出:Wed Jun 21 2023 14:40:15 GMT+0800 (中国标准时间)
</script>

ps:这个字符串应该是1个表示时区偏移量的字符串,格式为 "UTC+数字"。
其中数字表示与UTC时间的偏移量(单位为小时)。
例如,"UTC+8" 表示东八区。如果传递了这个参数,那么会创建一个表示特定时区的日期和时间。

我们的发现

我们发现 new Date()的日期格式返回,都是中国标准时间。

如何判断是否是时间对象呢?

我们为什么需要判断是否是时间对象呢?
因为:只有是时间对象才能调用 getTime(),getYear()....等方法

第一种:Object.prototype.toString.call(value) === '[object Date]'
如果返回的是true,说明是时间对象


第二种:时间值.constructor 如:
let date = new Date(); 
console.log(  date.constructor); // ƒ Date() { [native code] } 

选择的时间必须大于当前时间

很多时候,我们创建的表单需要进行验证:
1.用户如果选择了时间,时间必须要大于当前时间。
  如果不选择时间,则不进行校验。
  我们通过时间戳进行比较

我们在下面这个小例子中去看下怎么做?
我们需要做的是:
<template>
  <div>
    <h2>时间限制</h2>

    <el-form :model="ruleForm" ref="ruleForm" label-width="100px" class="demo-ruleForm">
      <el-form-item label="名称" style="width:500px">
        <el-input v-model="ruleForm.name"></el-input>
      </el-form-item>
      
      <el-form-item :rules="{validator:limitTime}" prop="time"  label="时间段">
        <el-date-picker
          v-model="ruleForm.time"
          type="datetimerange"
          :picker-options="pickerOptions"
          align="right"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          :default-time="['00:00:00', '23:59:59']">
        </el-date-picker>
      </el-form-item>

      <el-button type="primary" @click="onSubmit('ruleForm')">立即创建</el-button>
    </el-form>
  </div>
</template>

<script>
export default {
  data(){
    return{
      // 时间选中只能大于当前日期
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() < Date.now() - 8.64e7;
        }
      },
      ruleForm:{
        name:'',
        time:''
      }
    }
  },
  methods: {
    limitTime(rule,value,callback) {
      // 如果有时间进行验证,没有时间选择时间不进行验证
      if(value &&value.length>1){
        // 通过new Date返回13位数的时间戳
        let nowTime = new Date().getTime()
        // value[0] 是一个时间对象,时间对象可以调用 getTime 返回时间戳
        let endTime = value[0].getTime()
        if(nowTime>endTime){
          callback('开始时间不能小于当前时间')
        }else{
          callback()
        }
      }else {
        callback()
      }
    },
    onSubmit(ruleForm){
      this.$refs[ruleForm].validate((valid) => {
        console.log('valid', valid);
          if (valid) {
            alert('验证通过!');
          } else {
            alert('验证失败!');
            return false;
          }
        });
    }
  }
}
</script>

<style lang="scss" scoped>

</style>
有些小伙伴可能会说:这种限制会不会有问题。
刚开始选择的时间是大于当前时间,
但是用户点击确认的时候最初选择的时间小于了当期时间
其实是不会的,因为点击的时候还会验证一次。
因此,没有问题的。



特别重要:ios和安卓的时间日期格式兼容问题

时间格式在ios和android上有所不同。
在ios端,需要将格式 yyyy-mm-dd 进行转换为 yyyy/mm/dd

//格式为yyyy-mm-dd 【尽量不要使用这样的格式,有兼容性问题】
let time = 2021-12-22
 
//android可以正常使用,ios会出现NaN
new Date(time)
 
//ios需要转换为2021/12/22,同时安卓也支持
new Date(time.replace(/-/g,'/'))
 
然后就我们通过getTime()获取时间戳进行计算
ps:中国标准时间 如:Wed Aug 16 2023 08:00:00 GMT+0800 (中国标准时间) 在ios和 android 是上OK的

标签:00,16,重新学习,时间,2023,Date,new
From: https://www.cnblogs.com/IwishIcould/p/17637039.html

相关文章

  • C++ new和delete
    new关键字在C++中,当我们在函数内声明一个变量时,变量会被放在栈(stack)中。栈中的内存离开代码块就被释放了。而且栈的内存很小,当我们声明了大量变量可能会导致内存不足。内存除了栈以外,还有堆(heap),当我们在函数外声明一个全局变量时,这个变量就放在堆上。堆是程序未使用的内存,可以被......
  • new对象时内部做了什么?
    1.创建一个新对象;2.该对象执行[[Prototype]](即__proto__)链接;3.将构造函数的作用域赋值给新对象(this指向该新对象);4.执行构造函数中的代码(给该对象添加属性、方法);5.若无显式返回对象或函数,才返回新对象。 functionnewFn(fn,...args){//1.创建一个新对象......
  • 解锁New Bing
    阅前需知本文旨在介绍浏览器插件的功能、下载和使用方法,以帮助有兴趣的用户体验和利用NewBing的强大能力。本文不鼓励或支持任何违反国家法律法规或侵犯他人合法权益的行为。本文中提到的所有链接、图片、视频等资源都是由第三方提供的,与本文作者无关。本文作者不对这些资源的安......
  • IfcDateTime
    IfcDateTime类型定义IfcDataTime标识特定的时间点,以日历日内经过的小时、分钟和可选秒表示,以年、日历月和月中的天表示。它由一个特定的词汇表示后面的字符串值表示。IfcDataTime的词汇表示为YYYY-MM-DDThh:MM:ss,其中“YYYY”表示年份,“MM”表示月份,“DD”表示日期,前面有一个可......
  • SimpleDateFormat 线程安全问题修复方案
    问题介绍在日常的开发过程中,我们不可避免地会使用到JDK8之前的Date类,在格式化日期或解析日期时就需要用到SimpleDateFormat类,但由于该类并不是线程安全的,所以我们常发现对该类的不恰当使用会导致日期解析异常,从而影响线上服务可用率。以下是对SimpleDateFormat类不恰当......
  • MySQL-进阶篇 ( SQL 优化:插入 + 主键 + order by + group by + limit + count + updat
    MySQL-进阶篇(SQL优化)目录MySQL-进阶篇(SQL优化)SQL优化插入数据index批量插入手动提交事务主键插入大批量插入数据主键优化页分裂页合并主键设计原则orderby优化Usingfilesort:Usingindex:优化注意:groupby优化未创建索引时:创建索引后:优化limit优化count优化一......
  • DateTime 相关的操作汇总【C# 基础】
    〇、前言在日常开发中,日期值当然是不可或缺的,能够清晰的在脑海中梳理出最快捷的实现也非常重要,那么今天就来汇总一下。一、C#中的本机时间以及格式化如何取当前(本机)时间?很简单,一句话解决:DateTimedt_now=DateTime.Now;1.1单字母格式化日期时间值如下示例,将ToString()......
  • Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
    场景SpringBoot+Mybatis+定时任务实现大数据量数据分表记录和查询:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126225846通过以上分表实现的同结构不同表名之间的表,如何将一个表中的数据复制到另一个表中,且将日期字段进行同样的新增,时间字段不变。注:博客:ht......
  • 通用解决LocalDateTime转为字符串后中间含“T”
    importcom.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;importorg.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;importorg......
  • 解锁New Bing的终极方法
    为了访问NewBing,我做了很多尝试。。。1.newbinggogo (基本不能用了,很可惜的一个项目)2.无忧行-上网专用插件或无忧行-一款高效、免费、安全、稳定的上网插件分免费版和付费版,对于免费版而言,它能解锁Google,newbing,ChatGPT,但是从某一天起,www.bing.com/chat的聊天加上了......