精华内容
下载资源
问答
  • js读取excel中日期格式转换问题

    千次阅读 2019-11-12 16:04:45
    使用js-xlsx插件来读取excel时,会将2018/10/16这种数据自动装换成48264.12584511. 所以需要自己手动再转换回来 // excel读取2018/01/01这种时间格式是会将它装换成数字类似于46254.1545151415 numb是传过来的...

    方法一、

    在使用js-xlsx插件来读取excel时,会将2018/10/16这种数据自动装换成48264.12584511.

    所以需要自己手动再转换回来

    // excel读取2018/01/01这种时间格式是会将它装换成数字类似于46254.1545151415 numb是传过来的整数数字,format是之间间隔的符号
    

    1.方法①: 

        formatDate(numb, format) {
          const time = new Date((numb - 1) * 24 * 3600000 + 1)
          time.setYear(time.getFullYear() - 70)
          const year = time.getFullYear() + ''
          const month = time.getMonth() + 1 + ''
          const date = time.getDate() - 1 + ''
          if (format && format.length === 1) {
            return year + format + month + format + date
          }
          return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
        },
      console.log(formatDate(42618, '/')) // 2016-9-5

    2. 方法②:

    //excel日期格式转换 numb为数字,format为拼接符“-”
        function formatDate(numb, format) {
            if (numb != undefined) {
     
                let time = new Date((numb - 1) * 24 * 3600000 + 1)
                time.setYear(time.getFullYear() - 70)
                let year = time.getFullYear() + ''
                let month = time.getMonth() + 1 + ''
                let date = time.getDate() + ''
                if (format && format.length === 1) {
                    return year + format + month + format + date
                }
                return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
            } else {
                return undefined;
            }
        }

    方法二、时分秒转换:

    function formatTime(numb, format) {
                var hourTmp = numb * 24;
                var hour = Math.floor(hourTmp);
                var minuteTmp = hourTmp - hour;
                var minute = Math.round(minuteTmp * 60);
                return (hour < 10 ? '0' + hour : hour) + format + (minute < 10 ? '0' + minute : minute);
    }

    方法三、Js如何将一串数字转换为时间格式yyyy-MM-dd hh:mm:ss

    var time='20190306214635'
    time.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/g, '$1-$2-$3 $4:$5:$6');

    输出 

    2019-03-06 21:46:35

    方法四、

    今天写了一个ajax请求,当获取对象中的某个日期属性时,发现打印出来是一串数字,例如:1394786876000。可能有人会有疑问了,明明是日期格式,为什么不返回日期,而返回一串数字呢?其实这串数字是个时间戳,也就是从格林威治时间1970年01月01日00时00分00秒起至返回的那个日期的总秒数。如何将时间戳转化为我们需要的格式呢。

    在此只介绍一种简单的方法,也是我从网上找来的:

    1、在js中先加载一下代码,不需要做任何修改
    
    Date.prototype.format =function(format)
      {
      var o = {
      "M+" : this.getMonth()+1, //month
      "d+" : this.getDate(), //day
      "h+" : this.getHours(), //hour
      "m+" : this.getMinutes(), //minute
      "s+" : this.getSeconds(), //second
      "q+" : Math.floor((this.getMonth()+3)/3), //quarter
      "S" : this.getMilliseconds() //millisecond
      }
      if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
      (this.getFullYear()+"").substr(4- RegExp.$1.length));
      for(var k in o)if(new RegExp("("+ k +")").test(format))
      format = format.replace(RegExp.$1,
      RegExp.$1.length==1? o[k] :
      ("00"+ o[k]).substr((""+ o[k]).length));
      return format;
      }
    
    2、使用new Date(时间戳).format('yyyy-MM-dd')方法进行转化即可,返回的就是yyyy-MM-dd格式的值。
    

    最后为了方便大家的沟通与交流请加QQ群: 625787746

    请进QQ群交流:【IT博客技术分享群①】:https://jq.qq.com/?_wv=1027&k=DceI0140

    展开全文
  • excel更改日期格式无效 Excel日期不会更改格式 (Excel Dates Won’t Change Format) Have you ever imported data into Excel, from your credit card statement, or somewhere else, and found that Excel dates ...

    excel更改日期格式无效

    Have you ever imported data into Excel, from your credit card statement, or somewhere else, and found that Excel dates won't change format? And, if you try to sort that column of dates, things end up in the wrong order.

    您是否曾经从信用卡对帐单或其他地方将数据导入Excel,发现Excel日期不会更改格式? 而且,如果您尝试对那列日期进行排序,那么事情将以错误的顺序结束。

    That happened to me this week, and here’s how I fixed the problem, using a built-in Excel tool.

    这周发生在我身上,这就是我使用内置的Excel工具解决问题的方式。

    日期为文字 (Dates As Text)

    In the screen shot below, you can see the column of imported dates, which show the date and time. I didn’t want the times showing, but when I tried to format the column as Short Date, nothing happened – the dates stayed the same.

    在下面的屏幕快照中,您可以看到导入日期的列,其中显示了日期和时间。 我不希望显示时间,但是当我尝试将列格式设置为“短日期”时,什么也没发生–日期保持不变。

    problem dates

    Why won’t the dates change format? Even though they look like dates, Excel sees them as text, and Excel can’t apply number formatting to text.

    为什么日期不更改格式? 即使它们看起来像日期,Excel也会将它们视为文本,并且Excel无法将数字格式应用于文本。

    There are a few signs that the cell contents are being treated as text:

    有一些迹象表明单元格内容被视为文本:

    • The dates are left-aligned

      日期左对齐
    • There is an apostrophe at the start of the date (visible in the formula bar)

      日期开头有撇号(在编辑栏中可见)
    • If two or more dates are selected, the Quick Calc in the Status Bar only shows Count, not Numerical Count or Sum.

      如果选择了两个或多个日期,则状态栏中的“快速计算”仅显示计数,而不显示数值计数或总和。
    Quick Calc in the Status Bar

    确定日期 (Fix the Dates)

    If you want to sort the dates, or change their format, you’ll have to convert them to numbers – that’s how Excel stores valid dates. Sometimes, you can fix the dates by copying a blank cell, then selecting the date cells, and using Paste Special > Add to change them to real dates.

    如果要对日期进行排序或更改其格式,则必须将其转换为数字,这就是Excel存储有效日期的方式。 有时,您可以通过以下方式修复日期:复制空白单元格,然后选择日期单元格,然后使用“选择性粘贴”>“添加”将其更改为实际日期。

    Unfortunately, that technique didn’t work on this data, probably because of the extra spaces. You could go to each cell, and remove the apostrophe, but that could take quite a while, if you have more than a few dates to fix.

    不幸的是,可能由于多余的空间,该技术无法在此数据上使用。 您可以转到每个单元格并删除撇号,但是,如果要修复的日期不止几个,则可能要花费相当长的时间。

    A much quicker way is to use the Text to Columns feature, and let Excel do the work for you:

    一种更快的方法是使用“文本到列”功能,然后让Excel为您完成工作:

    • Select the cells that contain the dates

      选择包含日期的单元格
    • On the Excel Ribbon, click the Data tab

      在Excel功能区上,单击“数据”选项卡
    • Click Text to Columns

      单击文本到列
    Click Text to Columns

    In Step 1, select Delimited, and click Next

    在步骤1中,选择“定界”,然后单击“下一步”。

    select Delimited
    • In Step 2, select Space as the delimiter, and the preview pane should show the dates divided into columns.

      在第2步中,选择“空格”作为定界符,然后预览窗格应显示分为几列的日期。
    • Click Next

      点击下一步
    select Space as the delimiter

    In Step 3, you can set the data type for each column:

    在步骤3中,您可以为每一列设置数据类型:

    • In the preview pane, click on the date column, and select Date

      在预览窗格中,单击日期列,然后选择日期
    • In the Date drop down, choose the date format that your dates are currently displayed in. In this example, the dates show month/day/year, so I’ve selected MDY.

      在“日期”下拉列表中,选择当前显示日期的日期格式。在此示例中,日期显示为月/日/年,因此我选择了MDY。
    choose the date format
    • Select each of the remaining columns, and set it as “Do not import column (skip)”

      选择其余的每个列,并将其设置为“不导入列(跳过)”
    Do not import
    • Click Finish, to convert the text dates to real dates.

      单击完成,将文本日期转换为实际日期。

    格式化日期 (Format the Dates)

    Now that the dates have been converted to real dates (stored as numbers), you can format them with the Number Format commands.

    现在,日期已转换为实际日期(存储为数字),您可以使用数字格式命令将其格式化。

    There are a few signs that the cell contents are now being recognized as real dates (numbers):

    有迹象表明,单元格内容现在已被识别为实际日期(数字):

    • The dates are right-aligned

      日期右对齐
    • There is no apostrophe at the start of the date (visible in the formula bar)

      日期开头没有撇号(在编辑栏中可见)
    • If two or more dates are selected, the Quick Calc in the Status Bar shows Count, Numerical Count and Sum.

      如果选择了两个或多个日期,则状态栏中的“快速计算”将显示“计数”,“数字计数”和“总和”。
    Check Status Bar

    To format the dates, select them, and use the quick Number formats on the Excel Ribbon, or click the dialog launcher, to see more formats.

    要设置日期格式,请选择日期,然后使用Excel功能区上的快速数字格式,或单击对话框启动器以查看更多格式。

    Format the numbers

    Everything should work correctly, after you have converted the text dates to real dates.

    将文本日期转换为实际日期后,一切都应正常工作。

    下载样本文件 (Download the Sample File)

    To follow along with this tutorial, get the Date Format Fix Sample file from my Contextures website, on the Excel Dates Fix Format page.

    要继续本教程,请从Contextures网站上的Excel Dates Fix Format页面上获取Date Format Fix Sample文件。

    Fix Excel Dates Won't Change Format

    翻译自: https://contexturesblog.com/archives/2014/01/30/excel-dates-wont-change-format/

    excel更改日期格式无效

    展开全文
  • Excel在日期中加分隔使其分隔开来的方法介绍.docx
  • Excel 日期时间格式讲解

    千次阅读 2017-11-03 15:24:29
    Excel日期时间格式单元格类型为Numeric,表示Excel日期时间内部以double数值存储 double整数部分表示日期,表示自1900-1-1来的天数 double小数部分表示时间 1.2 日期时间转double方法org.apache.poi.ss.usermodel....

    1.Excel中日期时间

    1.1 存储格式

    • Excel中日期时间格式单元格类型为Numeric,表示Excel日期时间内部以double数值存储
    • Excel中日期时间以浮点值存储,以1900-01-01 00:00:00为起点
    • 浮点值整数部分代表日期,表示自1900-01-01起的天数
    • 浮点值小数部分代表时间
    • 浮点值1.0表示1900-01-01 00:00:00
    • Excel提供了将浮点值d转换为日期时间date的方法
      a. d在区间(-~, 0) 表示无效日期时间
      b. d在区间[0, 1) 转换为 日期时间区间[1899-12-31 00:00:00, 1900-01-01 00:00:00)
      c. d在区间[1, +~) 转换为 日期时间区间[1900-01-01 00:00:00, yyyy-MM-dd HH:mm:ss)

    • Excel提供了将日期时间date转换为浮点值d的方法
      a. date在区间(-~, 1900-01-01 00:00:00) 转换为 d = -1,表示无效日期时间
      b. date = 1900-01-01 00:00:00 转换为 d = 1.0
      c. date在区间(1900-01-01 00:00:00, +~) 转换为 d > 1.0
      这里写图片描述

    1.2 日期时间转double方法

    org.apache.poi.ss.usermodel.DateUtil

    /**
     * 将一个给的的日期转换为一个double类型的数值,代表日期在Excel内部的表现形式
     * double的整数部分表示自1900年1月1日以来的天数,小数表示时分秒
     * @param date : date
     * @param use1904windowing : true-使用1904年的日期窗口,false-使用1900年的日期窗口
     * @return 返回日期的Excel表示(如果错误 -检查小于0.1, 返回-1)
     * */
    public static double getExcelDate(Date date) // 默认使用1900窗口
    public static double getExcelDate(Date date, boolean use1904windowing)

    1.3 日期时间转double实例

    package org.apache.poi.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.poi.ss.usermodel.DateUtil;
    
    public class Date2DoubleTest {
    
        public static void main(String[] args) throws Exception {
            System.out.println("小于1900-01-01 00:00:00的日期返回-1");
            System.out.println("日期1800-01-01 00:00:00 转换为double值为: " + formatDouble("1800-01-01 00:00:00"));
            System.out.println("日期1899-01-01 00:00:00 转换为double值为: " + formatDouble("1899-01-01 00:00:00"));
            System.out.println("日期1899-12-31 23:24:25 转换为double值为: " + formatDouble("1899-12-31 23:24:25"));
            System.out.println("日期1900-01-01 00:00:00 转换为double值为: " + formatDouble("1900-01-01 00:00:00"));
            System.out.println("日期1900-01-01 11:11:11 转换为double值为: " + formatDouble("1900-01-01 11:11:11"));
            System.out.println("日期1900-01-01 22:22:22 转换为double值为: " + formatDouble("1900-01-01 22:22:22"));
            System.out.println("日期1900-01-01 23:22:22 转换为double值为: " + formatDouble("1900-01-01 23:22:22"));
            System.out.println("日期1900-01-02 00:00:00 转换为double值为: " + formatDouble("1900-01-02 00:00:00"));
            System.out.println("日期1900-01-03 00:00:00 转换为double值为: " + formatDouble("1900-01-03 00:00:00"));
            System.out.println("日期2017-11-12 13:14:15 转换为double值为: " + formatDouble("2017-11-12 13:14:15"));
        }
    
        public static double formatDouble (String dateStr) throws Exception {
            SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            Date date = dateFormat2.parse(dateStr); 
            return formatDouble(date);
        }
    
        /**
         * 将java.util.Date转换为double值
         * */
        public static double formatDouble (Date date) {
            double excelDate = DateUtil.getExcelDate(date);
    
            return excelDate;
        }
    }

    执行结果:

    小于1900-01-01 00:00:00的日期返回-1
    日期1800-01-01 00:00:00 转换为double值为: -1.0
    日期1899-01-01 00:00:00 转换为double值为: -1.0
    日期1899-12-31 23:24:25 转换为double值为: -1.0
    日期1900-01-01 00:00:00 转换为double值为: 1.0
    日期1900-01-01 11:11:11 转换为double值为: 1.466099537037037
    日期1900-01-01 22:22:22 转换为double值为: 1.9321990740740742
    日期1900-01-01 23:22:22 转换为double值为: 1.9738657407407407
    日期1900-01-02 00:00:00 转换为double值为: 2.0
    日期1900-01-03 00:00:00 转换为double值为: 3.0
    日期2017-11-12 13:14:15 转换为double值为: 43051.5515625

    这里写图片描述

    1.4 double转日期时间方法

    org.apache.poi.ss.usermodel.DateUtil

    /**
     * 将一个double类型的数值根据Excel内部日期格式转换为一个java.util.Date
     * 
     * 注意:
     * Excel日期和时间存储没有任何时区(TimeZone)信息
     * 如果默认的TimeZone使用了夏令时(Daylight Saving Time),则转换回Excel日期可能不会产生相同的值
     * 
     * @param date Excel内部日期值,一个double类型的数值
     * @param use1904windowing true-使用1904年的日期窗口,false-使用1900年的日期窗口
     * @param tz 对应的时区,如果为null,使用系统默认时区
     * @param roundSeconds 是否round最接近的秒,默认false
     * @return 日期的Java表示形式,如果日期不是有效的Excel日期,则为null
     * */
    public static Date getJavaDate(double date)
    public static Date getJavaDate(double date, boolean use1904windowing)
    public static Date getJavaDate(double date, TimeZone tz) // 使用时区tz去格式化日期
    public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz)
    public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz, boolean roundSeconds)

    1.5 double转日期时间实例

    package org.apache.poi.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.poi.ss.usermodel.DateUtil;
    
    public class Double2DateTest {
        public static void main(String[] args) {
            /**
             * double转换为java.util.Date
             * */
            System.out.println("double :    -1.0                转换为日期时间为:  " + formatDate(-1));
            System.out.println("double :    0.00000000000001    转换为日期时间为:  " + formatDate(0.00000000000001));
            System.out.println("double :    0.55555555555555    转换为日期时间为:  " + formatDate(0.55555555555555));
            System.out.println("double :    0.77777777777777    转换为日期时间为:  " + formatDate(0.77777777777777));
            System.out.println("double :    1.0                 转换为日期时间为:  " + formatDate(1.0));
            System.out.println("double :    1.466099537037037   转换为日期时间为:  " + formatDate(1.466099537037037));
            System.out.println("double :    1.9321990740740742  转换为日期时间为:  " + formatDate(1.9321990740740742));
            System.out.println("double :    1.9738657407407407  转换为日期时间为:  " + formatDate(1.9738657407407407));
            System.out.println("double :    2.0                 转换为日期时间为:  " + formatDate(2.0));
            System.out.println("double :    3.0                 转换为日期时间为:  " + formatDate(3.0));
            System.out.println("double :    43051.5515625       转换为日期时间为:  " + formatDate(43051.5515625));
        }
    
        /**
         * 将double值转换为java.util.Date
         * 1. 负数               -> 小于0,表示无效日期
         * 2. 1                -> 1900-1-1 00:00:00
         * 3. 43081.5091898148 -> 2017-12-12 12:13:14
         * @param value 
         * */
        public static String formatDate(double value) {
            if (!DateUtil.isValidExcelDate(value)) {
                // value<0表示是无效日期
                return "小于0,表示无效日期";
            }
            // HH表示24进制,hh是12进制
            return formatDate(value, "yyyy-MM-dd HH:mm:ss");
        }
    
        public static String formatDate(double value, String formatString) {
            SimpleDateFormat sdf = new SimpleDateFormat(formatString);
    //      Date date = DateUtil.getJavaDate(value); 
            // 以1900-1-1 00:00::00为起点
            Date date = DateUtil.getJavaDate(value, false);
    
            // 以1900-1-1 00:00::00为起点
    //      Date date = DateUtil.getJavaDate(value, true);
    
            return sdf.format(date);
        }
    }

    执行结果:
    以1900-1-1 00:00:00为起点

    double :    -1.0                转换为日期时间为:  小于0,表示无效日期
    double :    0.00000000000001    转换为日期时间为:  1899-12-31 00:00:00
    double :    0.55555555555555    转换为日期时间为:  1899-12-31 13:20:00
    double :    0.77777777777777    转换为日期时间为:  1899-12-31 18:40:00
    double :    1.0                 转换为日期时间为:  1900-01-01 00:00:00
    double :    1.466099537037037   转换为日期时间为:  1900-01-01 11:11:11
    double :    1.9321990740740742  转换为日期时间为:  1900-01-01 22:22:22
    double :    1.9738657407407407  转换为日期时间为:  1900-01-01 23:22:22
    double :    2.0                 转换为日期时间为:  1900-01-02 00:00:00
    double :    3.0                 转换为日期时间为:  1900-01-03 00:00:00
    double :    43051.5515625       转换为日期时间为:  2017-11-12 13:14:15

    这里写图片描述

    2.Excel日期单元格样式

    • Excel支持日期单元格
    • 日期值对应的是Excel内部日期double值的证书部分,表示自1900-1-1以来的天数

    2.1 Excel日期样式

    使用Excel或WPS设置单元格样式,会看到已经定义了日期样式

    2.1.1 对话框-已定义日期样式

    这里写图片描述

    2.1.2 对话框-自定义日期样式

    这里写图片描述

    2.2 Excel中已定义日期样式

    [$-804]表示国家或地区(语言)编号,一般可以不填。
    如804 汉语 (中国)
    809 英语(英国)
    409 英语(美国)
    如果电脑上没有装相应的语言(可以设),把804改掉都不会影响显示结果。
    
    [$-F800]相对于是 yyyy-m-d"
    [$-F400]相对于是 h:mm:ss
    
    [dbnum1]是将阿拉伯数字转换为汉字,如:123转换为一二三
    [dbbun2]是转换成大写汉字,如:123转换为壹贰叁
    [dbnum3]是转换为全角数字,如:123转换为 123
    d代表日期之中的日,m日期中的月,y日期中的年,h日期中的小时,m日期中的分,s是日期中的秒
    
    [$-F800]dddd, mmmm dd, yyyy
    [DBNum1][$-804]yyyy"年"m"月"d"日";@
    [DBNum1][$-804]yyyy"年"m"月";@
    [DBNum1][$-804]m"月"d"日";@
    yyyy"年"m"月"d"日";@
    yyyy"年"m"月";@
    m"月"d"日";@
    [$-804]aaaa;@
    [$-804]aaa;@
    yyyy/m/d;@
    [$-409]yyyy/m/d h:mm AM/PM;@
    yyyy/m/d h:mm;@
    yy/m/d;@
    m/d;@
    m/d/yy;@
    mm/dd/yy;@
    [$-409]d-mmm;@
    [$-409]d-mmm-yy;@
    [$-409]dd-mmm-yy;@
    [$-409]mmm-yy;@
    [$-409]mmmm-yy;@
    [$-409]mmmm-yy;@
    [$-409]mmmmm;@
    [$-409]mmmmm-yy;@

    2.3 Excel 2007中日期样式存储格式

    2.3.1 当前Sheet日期单元格

    这里写图片描述

    2.3.2 当前Sheet存储XML

    这里写图片描述

    2.3.3 当前Sheet单元格样式存储XML

    这里写图片描述

    2.4 验证日期样式字符串

    org.apache.poi.ss.usermodel.DateUtil提供方法验证

    package org.apache.poi.util;
    
    import org.apache.poi.ss.usermodel.DateUtil;
    
    /**
     * 验证Excel中已定义的日期格式
     * org.apache.poi.ss.usermodel.DateUtil
     * 
     * [$-804]表示国家或地区(语言)编号,一般可以不填。
     * 如804 汉语 (中国)
     *  809 英语(英国)
     *  409 英语(美国)
     * 如果电脑上没有装相应的语言(可以设),把804改掉都不会影响显示结果。
     * 
     * [$-F800]相对于是 yyyy-m-d"
     * [$-F400]相对于是 h:mm:ss
     * 
     * [dbnum1]是将阿拉伯数字转换为汉字,如:123转换为一二三
     * [dbbun2]是转换成大写汉字,如:123转换为壹贰叁
     * [dbnum3]是转换为全角数字,如:123转换为 123
     * d代表日期之中的日,m日期中的月,y日期中的年,h日期中的小时,m日期中的分,s是日期中的秒
     * */
    public class DateFormatTest {
        public static void main(String[] args) {
            System.out.println("字符串 - [$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy  是否是日期格式: " + DateUtil.isADateFormat(176, "[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy"));
            System.out.println("字符串 - [DBNum1][$-804]yyyy\"年\"m\"月\"d\"日 	 是否是日期格式: " + DateUtil.isADateFormat(177, "[DBNum1][$-804]yyyy\"年\"m\"月\"d\"日"));
            System.out.println("字符串 - [DBNum1][$-804]yyyy\"年\"m\"月\";@  	是否是日期格式: " + DateUtil.isADateFormat(178, "[DBNum1][$-804]yyyy\"年\"m\"月\";@"));
            System.out.println("字符串 - [DBNum1][$-804]m\"月\"d\"日\";@  	是否是日期格式: " + DateUtil.isADateFormat(179, "[DBNum1][$-804]m\"月\"d\"日\";@"));
            System.out.println("字符串 - yyyy\"年\"m\"月\"d\"日\";@       是否是日期格式: " + DateUtil.isADateFormat(180, "yyyy\"年\"m\"月\"d\"日\";@"));
            System.out.println("字符串 - yyyy\"年\"m\"月\";@             是否是日期格式: " + DateUtil.isADateFormat(181, "yyyy\"年\"m\"月\";@"));
            System.out.println("字符串 - m\"月\"d\"日\";@            是否是日期格式: " + DateUtil.isADateFormat(182, "m\"月\"d\"日\";@"));
            System.out.println("字符串 - [$-804]aaaa;@  			是否是日期格式: " + DateUtil.isADateFormat(183, "[$-804]aaaa;@"));
            System.out.println("字符串 - [$-804]aaa;@  			是否是日期格式: " + DateUtil.isADateFormat(184, "[$-804]aaa;@"));
            System.out.println("字符串 - yyyy/m/d;@            是否是日期格式: " + DateUtil.isADateFormat(185, "yyyy/m/d;@"));
            System.out.println("字符串 - [$-409]yyyy/m/d\\ h:mm\\ AM/PM;@    是否是日期格式: " + DateUtil.isADateFormat(186, "[$-409]yyyy/m/d\\ h:mm\\ AM/PM;@"));
            System.out.println("字符串 - yyyy/m/d\\ h:mm;@         是否是日期格式: " + DateUtil.isADateFormat(187, "yyyy/m/d\\ h:mm;@"));
            System.out.println("字符串 - yy/m/d;@              是否是日期格式: " + DateUtil.isADateFormat(188, "yy/m/d;@"));
            System.out.println("字符串 - m/d;@                 是否是日期格式: " + DateUtil.isADateFormat(189, "m/d;@"));
            System.out.println("字符串 - m/d/yy;@              是否是日期格式: " + DateUtil.isADateFormat(190, "m/d/yy;@"));
            System.out.println("字符串 - mm/dd/yy;@            是否是日期格式: " + DateUtil.isADateFormat(191, "mm/dd/yy;@"));
            System.out.println("字符串 - [$-409]d\\-mmm;@  			是否是日期格式: " + DateUtil.isADateFormat(192, "[$-409]d\\-mmm;@"));
            System.out.println("字符串 - [$-409]d\\-mmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(193, "[$-409]d\\-mmm\\-yy;@"));
            System.out.println("字符串 - [$-409]dd\\-mmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(194, "[$-409]dd\\-mmm\\-yy;@"));
            System.out.println("字符串 - [$-409]mmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(195, "[$-409]mmm\\-yy;@"));
            System.out.println("字符串 - [$-409]mmmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(196, "[$-409]mmmm\\-yy;@"));
            System.out.println("字符串 - [$-409]mmmmm;@  			是否是日期格式: " + DateUtil.isADateFormat(197, "[$-409]mmmmm;@"));
            System.out.println("字符串 - [$-409]mmmmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(198, "[$-409]mmmmm\\-yy;@"));
        }
    }

    执行结果:

    字符串 - [$-F800]dddd\,\ mmmm\ dd\,\ yyyy  是否是日期格式: true
    字符串 - [DBNum1][$-804]yyyy"年"m"月"d"日     是否是日期格式: true
    字符串 - [DBNum1][$-804]yyyy"年"m"月";@     是否是日期格式: true
    字符串 - [DBNum1][$-804]m"月"d"日";@    是否是日期格式: true
    字符串 - yyyy"年"m"月"d"日";@         是否是日期格式: true
    字符串 - yyyy"年"m"月";@             是否是日期格式: true
    字符串 - m"月"d"日";@            是否是日期格式: true
    字符串 - [$-804]aaaa;@            是否是日期格式: false
    字符串 - [$-804]aaa;@             是否是日期格式: false
    字符串 - yyyy/m/d;@            是否是日期格式: true
    字符串 - [$-409]yyyy/m/d\ h:mm\ AM/PM;@    是否是日期格式: true
    字符串 - yyyy/m/d\ h:mm;@          是否是日期格式: true
    字符串 - yy/m/d;@              是否是日期格式: true
    字符串 - m/d;@                 是否是日期格式: true
    字符串 - m/d/yy;@              是否是日期格式: true
    字符串 - mm/dd/yy;@            是否是日期格式: true
    字符串 - [$-409]d\-mmm;@              是否是日期格式: true
    字符串 - [$-409]d\-mmm\-yy;@          是否是日期格式: true
    字符串 - [$-409]dd\-mmm\-yy;@         是否是日期格式: true
    字符串 - [$-409]mmm\-yy;@         是否是日期格式: true
    字符串 - [$-409]mmmm\-yy;@        是否是日期格式: true
    字符串 - [$-409]mmmmm;@           是否是日期格式: true
    字符串 - [$-409]mmmmm\-yy;@       是否是日期格式: true

    这里写图片描述

    3. Excel 时间单元格样式

    • Excel单元格也支持时间单元格
    • 时间值对应的是Excel内部时间double值的小数部分

    3.1 Excel时间样式

    使用Excel或WPS设置单元格样式,会看到已经定义了时间样式,我们主要讲解的就是这些时间样式:

    3.1.1 对话框-已定义时间样式

    这里写图片描述

    3.1.2 对话框-自定义时间样式

    这里写图片描述

    3.2 Excel中已定义时间样式

    两种设置时间样式一共有19种已经定义的时间样式,内置的时间样式索引小于50,自定义样式索引从164开始:

     - 索引         时间样式字符串
     - 18,       "h:mm AM/PM"  
     - 19,       "h:mm:ss AM/PM"  
     - 20,       "h:mm"  
     - 21,       "h:mm:ss"  
     - 22,       "m/d/yy h:mm"  
     - 45,       "mm:ss"  
     - 46,       "[h]:mm:ss"  
     - 47,       "mm:ss.0" 
     - 
     - 176    [DBNum1][$-804]上午/下午h"时"mm"分";@
     - 177    [DBNum1][$-804]h"时"mm"分";@
     - 178    [$-409]h:mm:ss\ AM/PM;@
     - 179    [$-409]h:mm\ AM/PM;@
     - 180    [$-F400]h:mm:ss\ AM/PM
     - 181    h:mm;@
     - 182    h:mm:ss;@
     - 183    h"时"mm"分";@
     - 184    h"时"mm"分"ss"秒";@
     - 185    上午/下午h"时"mm"分";@
     - 186    上午/下午h"时"mm"分"ss"秒";@ 

    3.3 Excel 2007中时间样式存储格式

    3.3.1 当前Sheet时间单元格

    这里写图片描述

    3.3.2 当前Sheet存储XML

    这里写图片描述

    3.3.3 当前Sheet单元格样式存储XML

    这里写图片描述

    3.4 验证时间样式字符串

    提供方法实现验证一个单元格是否为一个时间单元格:
    - 时间单元格原始值为double
    - 时间单元格样式为时间字符串
    这里提供方法解析单元格样式字符串,验证其是否为时间样式字符串,工具类:

    package org.apache.poi.util;
    
    import java.util.regex.Pattern;
    
    /**
     * 主要用于处理导入excel中日期时间格式, 
     * 参考org.apache.poi.ss.usermodel.DateUtil
     * */
    public class DateTimeUtil {
    
        protected DateTimeUtil() {
            // no instances of this class
        }
    
        // 描述无效的日期
    //  private static final int BAD_DATE = -1;
    
        public static final int SECONDS_PER_MINUTE = 60;
        public static final int MINUTES_PER_HOUR = 60;
        public static final int HOURS_PER_DAY = 24;
        // 一天等于86400秒
        public static final int SECONDS_PER_DAY = (HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE);
    
        // 一天等于86400 * 1000毫秒
        public static final long DAY_MILLISECONDS = SECONDS_PER_DAY * 1000L;
    
    //  private static final Pattern TIME_SEPARATOR_PATTERN = Pattern.compile(":");
    
        /**
         * 符号. : 匹配除换行符 \n 之外的任何单字符
         * 符号* : 匹配前面的子表达式零次或多次
         * 符号+ : 匹配前面的子表达式一次或多次
         * 符号? : 匹配前面的子表达式零次或一次
         * 
         * *、 +限定符都是贪婪的,因为它们会尽可能多的匹配文字
         * 通过在 *、 + 或 ? 限定符之后放置 ?(*?、 +?、 ??),该表达式从"贪心"表达式转换为"非贪心"表达式或者最小匹配
         * */
    
        // ^[\$\-.*?] : 匹配以[$-开头,中间为除换行符 \n 之外的任何单字符,结尾为]的字符串,非贪心匹配
        private static final Pattern date_ptrn1 = Pattern.compile("^\\[\\$\\-.*?\\]");
    
        /**
         * 红色 : \u7ea2\u8272
         * 黑色 :\u9ed1\u8272
         * 黄色 :  \u9ec4\u8272
         * 绿色 : \u7eff\u8272
         * 白色 : \u9ed1\u8272
         * 蓝色 : \u84dd\u8272
         * 青色 : \u9752\u8272
         * 洋红 : \u6d0b\u7ea2
         * */
        // ^[[a-zA-Z]+] : 匹配以[开头, ]结尾, 中间至少一个字母的字符串,如颜色
        private static final Pattern date_ptrn2 = Pattern.compile("^\\[[a-zA-Z\u7ea2\u9ed1\u9ec4\u7eff\u84dd\u9752\u6d0b\u7ea2\u8272]+\\]");
    
        // [yYmMdDhHsS] : 匹配中括号里任一字母, 匹配一个
        private static final Pattern date_ptrn3a = Pattern.compile("[mhHsS]");
    
        /**
         * 为中文/日文日期格式添加Unicode编码:如2017 \u5e74 2 \u6708 7 \u65e5
         * Unicode编码  : 中文
         *    \u5e74 : 年
         *    \u6708 : 月
         *    \u65e5 : 日
         *    \u4e0a : 上
         *    \u4e0b : 下
         *    \u5348 : 午
         *    
         * ^[\[\]mhHsS\-T/时分秒(上午/下午),. :"\\]+0*[ampAMP/]*$
         * */
        private static final Pattern date_ptrn3b = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-T/\u65f6\u5206\u79d2(\u4e0a\u5348/\u4e0b\u5348),. :\"\\\\]+0*[ampAMP/]*$");
    
        // ^\[([hH]+|[mM]+|[sS]+)] : 匹配以[开头, 以]结尾, 中间为时、分或秒的时间字符
        private static final Pattern date_ptrn4 = Pattern.compile("^\\[([hH]+|[mM]+|[sS]+)\\]");
    
        // 匹配以[DBNum1]、[DBNum2]或[DBNum3]开头的中文日期
        private static final Pattern date_ptrn5 = Pattern.compile("^\\[DBNum(1|2|3)\\]");
    
        /**
         * 性能优化的变量:
         * 如果一个相同的日期格式字符串被多次传递,避免重复检查DataUtil.isADateFormat(int, String)
         * https://issues.apache.org/bugzilla/show_bug.cgi?id=55611
         * */
        private static ThreadLocal<Integer> lastFormatIndex = new ThreadLocal<Integer>() {
            protected Integer initialValue() {
                return -1;
            }
        };
        private static ThreadLocal<String> lastFormatString = new ThreadLocal<String>();
        private static ThreadLocal<Boolean> lastCachedResult = new ThreadLocal<Boolean>();
    
        /**
         * 当前格式是否缓存过
         * @param formatString 格式化字符串
         * @param formatIndex 格式化索引
         * */
        private static boolean isCached(String formatString, int formatIndex) {
            String cachedFormatString = lastFormatString.get();
            return cachedFormatString != null && 
                         formatIndex == lastFormatIndex.get() && 
                         formatString.equals(cachedFormatString);
        }
    
        /**
         * 缓存当前格式
         * @param formatString 格式化字符串
         * @param formatIndex 格式化索引
         * @param cached 是否已经缓存过
         * */
        private static void cache(String formatString, int formatIndex, boolean cached) {
            lastFormatIndex.set(formatIndex);
            lastFormatString.set(formatString);
            lastCachedResult.set(Boolean.valueOf(cached));
        }
    
        /**
         * 检查给定格式ID及其格式String是否表示时间格式。
         * 1. 调用此方法之前org.apache.poi.ss.usermodel.DateUtil.isADateFormat(formatIndex, formatString)
         *      首先确保是一个日期格式
         * 2. 再检查是否为时间格式
         *
         * @param formatIndex 格式索引
         * @param formatString 格式字符串
         */
        public static boolean isADateTimeFormat(int formatIndex, String formatString) {
            if(isInternalDateTimeFormat(formatIndex)) {
                cache(formatString, formatIndex, true);
                return true;
            }
    
            if(formatString == null || formatString.length() == 0) {
                return false;
            }
    
            // 检查是否缓存过,提高性能
            if (isCached(formatString, formatIndex)) {
                return lastCachedResult.get();
            }
    
            String fs = formatString;
            final int length = fs.length();
            StringBuilder sb = new StringBuilder(length);
            for (int i = 0; i < length; i++) {
                char c = fs.charAt(i);
                if (i < length - 1) {
                    char nc = fs.charAt(i + 1);
                    if (c == '\\') {// 处理转义字符
                        switch (nc) {
                            case '-': // \-表示
                            case ',':
                            case '.':
                            case ' ':
                            case '\\':
                                // skip current '\' and continue to the next char
                                continue;
                        }
                    } else if (c == ';' && nc == '@') {// 跳过;@
                        i++;
                        continue;
                    }
                }
                sb.append(c);
            }
            fs = sb.toString();
    
            // short-circuit if it indicates elapsed time: [h], [m] or [s]
            if(date_ptrn4.matcher(fs).matches()){
                cache(formatString, formatIndex, true);
                return true;
            }
    
            // 处理以[DBNum1]、 [DBNum2]或[DBNum3]开头的时间格式:[DBNum1][$-804]h"时"mm"分";@
            fs = date_ptrn5.matcher(fs).replaceAll("");
    
            // 处理匹配[$-...]的时间格式:[$-F400]h:mm:ss\ AM/PM
            fs = date_ptrn1.matcher(fs).replaceAll("");
    
            // 匹配以[开头, ]结尾, 中间至少一个字母的字符串,如带颜色的时间格式:[Yellow]h:mm:ss AM/PM
            fs = date_ptrn2.matcher(fs).replaceAll("");
    
            // 日期格式为dd / mm / yy; [red] dd / mm / yy,只处理第一个
            final int separatorIndex = fs.indexOf(';');
            if(0 < separatorIndex && separatorIndex < fs.length()-1) {
                fs = fs.substring(0, separatorIndex);
            }
    
            // 处理时间格式
            if (! date_ptrn3a.matcher(fs).find()) {
                return false;
            }
    
            /**
             * 到了这里,检查它只是由以下组成:  m h s - \ /,。 :[] T
             * 可选地跟随AM / PM
             * */
            boolean result = date_ptrn3b.matcher(fs).matches();
            cache(formatString, formatIndex, result);
            return result;
        }
    
        /**
         * 给定的日期格式索引是否为Excel内置日期时间格式
         * @param format 日期格式索引
         */
        public static boolean isInternalDateTimeFormat(int format) {
            switch(format) {
                // Excel内部时间格式
                //          0x12,       "h:mm AM/PM"  
                //          0x13,       "h:mm:ss AM/PM"  
                //          0x14,       "h:mm"  
                //          0x15,       "h:mm:ss"  
                //          0x16,       "m/d/yy h:mm"  
                //          0x2d,       "mm:ss"  
                //          0x2e,       "[h]:mm:ss"  
                //          0x2f,       "mm:ss.0"  
                case 0x12:
                case 0x13:
                case 0x14:
                case 0x15:
                case 0x16:
                case 0x2d:
                case 0x2e:
                case 0x2f:
                    return true;
            }
            return false;
        }
    
        /**
         * 检查给定的double数值是否是有效的Excel日期
         * value>=0,表示是有效日期
         */
        public static boolean isValidExcelDate(double value) {
            return (value > -Double.MIN_VALUE);
        }
    
        /************************ 以下是org.apache.poi.ss.usermodel.DateUtil常用方法   ******************************/
    
        /**
         * 将一个给的的日期转换为一个double类型的数值,代表日期在Excel内部的表现形式
         * double的整数部分表示自1900年1月1日以来的天数,小数表示时分秒
         * @param date : date
         * @param use1904windowing : true-使用1904年的日期窗口,false-使用1900年的日期窗口
         * @return 返回日期的Excel表示(如果错误 -检查小于0.1, 返回-1)
         * */
    //  public static double getExcelDate(Date date) // 默认使用1900窗口
    //  public static double getExcelDate(Date date, boolean use1904windowing)
    
        /**
         * 将一个double类型的数值根据Excel内部日期格式转换为一个java.util.Date
         * 
         * 注意:
         * Excel日期和时间存储没有任何时区(TimeZone)信息
         * 如果默认的TimeZone使用了夏令时(Daylight Saving Time),则转换回Excel日期可能不会产生相同的值
         * 
         * @param date Excel内部日期值,一个double类型的数值
         * @param use1904windowing true-使用1904年的日期窗口,false-使用1900年的日期窗口
         * @param tz 对应的时区,如果为null,使用系统默认时区
         * @param roundSeconds 是否round最接近的秒,默认false
         * @return 日期的Java表示形式,如果日期不是有效的Excel日期,则为null
         * */
    //  public static Date getJavaDate(double date)
    //  public static Date getJavaDate(double date, boolean use1904windowing)
    //  public static Date getJavaDate(double date, TimeZone tz) // 使用时区tz去格式化日期
    //  public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz)
    //  public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz, boolean roundSeconds)
    
        /**
         * 将一个格式为HH:MM或HH:MM:SS的时间字符串转换为Excel日期格式的double数值,一个小数
         * @param timeStr 如12:12、 12:12:12,timeStr长度小于4或大于8都会抛出异常
         * @return 返回一个0~1之间的数
         */
    //  public static double convertTime(String timeStr)
    //  private static double convertTimeInternal(String timeStr)
    }

    测试类:

    package org.apache.poi.util;
    
    /**
     * 
     * 索引         时间样式字符串
     * 18,       "h:mm AM/PM"  
     * 19,       "h:mm:ss AM/PM"  
     * 20,       "h:mm"  
     * 21,       "h:mm:ss"  
     * 22,       "m/d/yy h:mm"  
     * 45,       "mm:ss"  
     * 46,       "[h]:mm:ss"  
     * 47,       "mm:ss.0" 
     * 
     * 176    [DBNum1][$-804]上午/下午h"时"mm"分";@
     * 177    [DBNum1][$-804]h"时"mm"分";@
     * 178    [$-409]h:mm:ss\ AM/PM;@
     * 179    [$-409]h:mm\ AM/PM;@
     * 180    [$-F400]h:mm:ss\ AM/PM
     * 181    h:mm;@
     * 182    h:mm:ss;@
     * 183    h"时"mm"分";@
     * 184    h"时"mm"分"ss"秒";@
     * 185    上午/下午h"时"mm"分";@
     * 186    上午/下午h"时"mm"分"ss"秒";@ 
     * */
    public class TimeFormatTest {
        public static void main(String[] args) {
            System.out.println("Excel已定义时间格式字符串: ");
            System.out.println("字符串 - h:mm AM/PM                             是否是时间格式: " + DateTimeUtil.isADateTimeFormat(18, "h:mm AM/PM"));
            System.out.println("字符串 - h:mm:ss AM/PM                          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(19, "h:mm:ss AM/PM"));
            System.out.println("字符串 - h:mm                                   是否是时间格式: " + DateTimeUtil.isADateTimeFormat(20, "h:mm"));
            System.out.println("字符串 - h:mm:ss                                是否是时间格式: " + DateTimeUtil.isADateTimeFormat(21, "h:mm:ss"));
            System.out.println("字符串 - m/d/yy h:mm                            是否是时间格式: " + DateTimeUtil.isADateTimeFormat(22, "m/d/yy h:mm"));
            System.out.println("字符串 - mm:ss                                  是否是时间格式: " + DateTimeUtil.isADateTimeFormat(45, "mm:ss"));
            System.out.println("字符串 - [h]:mm:ss                              是否是时间格式: " + DateTimeUtil.isADateTimeFormat(46, "[h]:mm:ss"));
            System.out.println("字符串 - mm:ss.0                                                                                           是否是时间格式: " + DateTimeUtil.isADateTimeFormat(47, "mm:ss.0"));
            System.out.println("字符串 - [DBNum1][$-804]上午/下午h\"时\"mm\"分\";@  是否是时间格式: " + DateTimeUtil.isADateTimeFormat(176, "[DBNum1][$-804]上午/下午h\"时\"mm\"分\";@"));
            System.out.println("字符串 - [DBNum1][$-804]h\"时\"mm\"分\";@          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(177, "[DBNum1][$-804]h\"时\"mm\"分\";@"));
            System.out.println("字符串 - [$-409]h:mm:ss\\ AM/PM;@               是否是时间格式: " + DateTimeUtil.isADateTimeFormat(178, "[$-409]h:mm:ss\\ AM/PM;@"));
            System.out.println("字符串 - [$-409]h:mm\\ AM/PM;@                  是否是时间格式: " + DateTimeUtil.isADateTimeFormat(179, "[$-409]h:mm\\ AM/PM;@"));
            System.out.println("字符串 - [$-F400]h:mm:ss\\ AM/PM                是否是时间格式: " + DateTimeUtil.isADateTimeFormat(180, "[$-F400]h:mm:ss\\ AM/PM"));
            System.out.println("字符串 - h:mm;@                                 是否是时间格式: " + DateTimeUtil.isADateTimeFormat(181, "h:mm;@"));
            System.out.println("字符串 - h:mm:ss;@                              是否是时间格式: " + DateTimeUtil.isADateTimeFormat(182, "h:mm:ss;@"));
            System.out.println("字符串 - h\"时\"mm\"分\";@                        是否是时间格式: " + DateTimeUtil.isADateTimeFormat(183, "h\"时\"mm\"分\";@"));
            System.out.println("字符串 - h\"时\"mm\"分\"ss\"秒\";@                是否是时间格式: " + DateTimeUtil.isADateTimeFormat(184, "h\"时\"mm\"分\"ss\"秒\";@"));
            System.out.println("字符串 - 上午/下午h\"时\"mm\"分\";@                 是否是时间格式: " + DateTimeUtil.isADateTimeFormat(185, "上午/下午h\"时\"mm\"分\";@"));
            System.out.println("字符串 - 上午/下午h\"时\"mm\"分\"ss\"秒\";@          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(186, "上午/下午h\"时\"mm\"分\"ss\"秒\";@"));
    
            System.out.println();
            System.out.println("Excel自定义时间格式字符串:");
            System.out.println("字符串 - [红色]上午/下午h\"时\"mm\"分\"ss\"秒\";@          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(187, "[红色]上午/下午h\"时\"mm\"分\"ss\"秒\";@"));
            System.out.println("字符串 - [绿色]yyyy/mm/dd hh:mm          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(188, "[绿色]yyyy/mm/dd hh:mm"));
        }
    }

    执行结果:

    Excel已定义时间格式字符串: 
    字符串 - h:mm AM/PM                            是否是时间格式: true
    字符串 - h:mm:ss AM/PM                         是否是时间格式: true
    字符串 - h:mm                                  是否是时间格式: true
    字符串 - h:mm:ss                               是否是时间格式: true
    字符串 - m/d/yy h:mm                           是否是时间格式: true
    字符串 - mm:ss                                 是否是时间格式: true
    字符串 - [h]:mm:ss                             是否是时间格式: true
    字符串 - mm:ss.0                                                                                           是否是时间格式: true
    字符串 - [DBNum1][$-804]上午/下午h"时"mm"分";@  是否是时间格式: true
    字符串 - [DBNum1][$-804]h"时"mm"分";@          是否是时间格式: true
    字符串 - [$-409]h:mm:ss\ AM/PM;@              是否是时间格式: true
    字符串 - [$-409]h:mm\ AM/PM;@                 是否是时间格式: true
    字符串 - [$-F400]h:mm:ss\ AM/PM               是否是时间格式: true
    字符串 - h:mm;@                               是否是时间格式: true
    字符串 - h:mm:ss;@                            是否是时间格式: true
    字符串 - h"时"mm"分";@                         是否是时间格式: true
    字符串 - h"时"mm"分"ss"秒";@                   是否是时间格式: true
    字符串 - 上午/下午h"时"mm"分";@                 是否是时间格式: true
    字符串 - 上午/下午h"时"mm"分"ss"秒";@           是否是时间格式: true
    
    Excel自定义时间格式字符串:
    字符串 - [红色]上午/下午h"时"mm"分"ss"秒";@      是否是时间格式: true
    字符串 - [绿色]yyyy/mm/dd hh:mm                是否是时间格式: true

    这里写图片描述

    4.注意

    4.1 只有时间

    • 在Excel一个Sheet单元格中输入:11:12:13
    • 设置单元格样式为时间:h:mm:ss;@
    • 11:12:13单元格为Numeric类型,以double值存储,不是一个字符串单元格
      因为只有时间,而没有日期,所以double只有小数,整部部分为0,存储的值是一个小于1的数。
      当前Sheet的时间单元格:
      这里写图片描述
      存储:
      这里写图片描述
      这里写图片描述

    4.2 日期小于1900-1-1

    • 一个单元格为:1899/12/31,一个为:1900/1/1
    • 设置单元格样式为日期:yyyy”年”m”月”d”日”;@
    • 1899/12/31会以字符串存储,日期样式不起效
    • 1900/1/1会以double值存储,日期样式起效,显示为1900年1月1日
      这里写图片描述
    • sheet1.xml存储Sheet单元格信息
      这里写图片描述
    • SharedStrings.xml存储Excel中所有Sheet字符型单元格的文本值
      这里写图片描述
    • styles.xml存储Excel中所有Sheet的所有单元格样式信息
      这里写图片描述
    展开全文
  • JS 转换Excel日期数字 转回日期格式

    千次阅读 2019-07-11 17:25:39
    //excel日期格式转换 numb为数字,format为拼接“-” function formatDate(numb, format) { if (numb != undefined) { let time = new Date((numb - 1) * 24 * 3600000 + 1) time.setYear(t...
    //excel日期格式转换 numb为数字,format为拼接符“-”
        function formatDate(numb, format) {
            if (numb != undefined) {
    
                let time = new Date((numb - 1) * 24 * 3600000 + 1)
                time.setYear(time.getFullYear() - 70)
                let year = time.getFullYear() + ''
                let month = time.getMonth() + 1 + ''
                let date = time.getDate() + ''
                if (format && format.length === 1) {
                    return year + format + month + format + date
                }
                return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
            } else {
                return undefined;
            }
        }

     

    展开全文
  • POI识别Excel表格的中文时间和日期格式单元格 本文的重点是解决两个问题: 1、POI识别Excel的时间包含中文,例如:2021年1月22日 2、POI识别Excel中单元格为日期类型或时间类型的时间数据 前言: 本文主要以示例解决...
  • EXCEL实现时间戳格式日期格互转

    万次阅读 2017-09-25 11:33:26
    其中C1就是所需的日期格式,C1单元格属性改成日期格式就可以了。 正常日期转为时间戳格式公式: A1=(C1-70*365-19)*86400-8*3600 其中C1表示正常日期时间格式; 其中A1就是所需的时间戳格式,A
  • 如何在Excel 使用日期与时间

    千次阅读 2013-04-06 10:37:48
    如何使用 Excel 日期和时间 文章编号: 214094 - 查看本文应用于的产品 展开全部 | 关闭全部 本页 概要 本文逐步介绍了如何使用 Microsoft Excel 的内置日期和时间函数执行复杂的日期和时间...
  • excel日期格式转换 numb为数字,format为拼接“-” function formatDate(numb, format) { if (numb != undefined) { let time = new Date((numb - 1) * 24 * 3600000 + 1) time.setYear(ti...
  • EXCEL中日期的加减函数

    千次阅读 2013-05-13 23:55:50
    进行日期的加减的过程,不得提到日期格式,因为EXCEL对需要进行加减的日期格式是有一定的要求的,进来看看 日期格式的设定:设置单元格格式为自定义aaaammdda代表星期,m代表月,d代表日也可以月和日之间...
  • excel更改页眉页脚 带格式日期Excel页脚 (Excel Footer with Formatted Date)It's Fancy Footer Friday! Check with your boss – maybe you can leave early to celebrate. 星期五是花式页脚! 与老板核实一下-...
  • Excel转CSV分隔问题

    千次阅读 2019-01-04 17:10:35
    1.找到本机的控制面板 2.更改日期、时间或数字格式 3.其他设置 4.列表分隔“,”改为“$” 5.进入Excel另存为CSV格式 ps:根据实际情况修改分隔
  • 本文逐步介绍了如何使用 Microsoft Excel 的内置日期和时间函数执行复杂的日期和时间计算。 Excel 将所有日期存储为整数,将所有时间存储为小数。有了此系统,Excel 可以像处理任何其他数字一样对日期和时间进行加...
  • Excel中数字格式的应用归纳

    千次阅读 2011-07-17 22:17:51
    Excel中数字格式的应用归纳(一) 一、快速格式化单元格数字 可以使用工具栏按钮对单元格的数字进行格式化。如图1所示,这五个按钮依次为:货币、百分比、千位分隔、增加小数位数、减少小数位数。若选定区域或选定...
  • excel单元格自定义格式1代码结构组成代码码分为四个部分,中间用“;”号分隔,具体如下:正数格式;负数格式;零格式;文本格式各个参数的涵义“G/通用格式”:以常规的数字显示,相当于“分类”列表的“常规”...
  • 平时我们在Excel表格输入日期时,年月日之间的分隔符号输入起来也比较麻烦。如果现在我们只是输入日期数字,不加入分隔,然后能够统一设置分隔就好了。哈哈,Excel表格早就有这项功能啦,只是你不知道罢了,...
  • 示例:转换成英文日期 如图所示,该表为某公司合同签订日期。现需要将合同签订日期转换成英文日期,该如何通过VBA批量实现? 姓名 合同签订日期 英文日期1 英文日期2 英文日期3 辛劭钧 2010/1/1...
  • 连接USB数据线,点击Excel文件第一个工作表的导入按钮,打开文件对话框,定位到M8/disk/backup/[日期时间]/contact目录,按ctrl+A,全选vcf文件,确定关闭对话框,完成文件导入。 导出: 1、完成数据录入编辑...
  • var workbook = XLSX.read(data, { type: 'binary', cellDates: true, // cellStyles: false })
  • js转化excel日期

    2020-12-25 11:42:44
    js转化excel日期(亲测 ~ _~) 因使用js-xlsx读取excel得到的日期不是正常的日期格式,所以从网上找了一下转化的方法,但是没找到一个合适的,下面展示我所采坑的两个方法,分别为百度出来的前两位,望采纳 1. 采...
  • 在excel上画交换机面板 如何在Excel中创建面板图 (How to Create a Panel Chart in Excel) To show a concise, clear summary of data for several departments or cities, you can create a panel chart in Excel....
  • Excel自定义格式详解

    千次阅读 多人点赞 2018-07-19 11:54:59
    ”G/通用格式”:以常规的数字显示,相当于”分类”列表的”常规”选项。 例:代码:”G/通用格式”。10显示为10;10.1显示为10.1。 2、 “#”:数字占位。只显有意义的零而不显示无意义
  • Excel设置数字格式

    千次阅读 2018-08-28 14:27:13
    在Excel2016,用数字表示的内容很多,例如,小数、货币、百分比和时间等。单元格改变数值的小数位数、为数值添加货币符号的具体操作步骤如下。 选择单元格区域B4:E16。 单击【开始】选项卡下【数字】选项组...
  • Excel 的单元格格式是一个最基本但是又很高级的技能,说它基本是因为我们几乎天天都会用到它,会用它来设置一些简单的格式,比如日期,文本等等;高级是因为利用 Excel 单元格的自定义格式我们可以实现一些看起来...
  • excel单元格格式设置

    2021-03-31 22:13:14
    单元格格式窗口快捷键:ctrl+1 1.单元格部分快捷键设置 设置单元格常规格式快捷键:Ctrl+Shift+`(只有microsotf office... 时间格式快捷键:Ctrl+Shift+2(24小时计时法,显示时分,跟随系统所在区域格式) 时间
  • Excel文件的单元格“5月30日早待生产”的日期部分,每次修改文件后自动更新日期。 2 解决措施: “公式窗口”输入=TEXT(TODAY(),"yyyy年m月d日"&"早待生产"),即可实现。 3 函数详解: 1.Excel中&...
  • DATE 函数: 从年、月、日来计算日期。 官方说明: 从指定的年、月、日来计算日期序列号值。...若要显示序列号或要更改日期格式,请“开始”选项卡的“数字”组选择其他数字格式。 函数应用实例

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,915
精华内容 5,966
关键字:

在excel中日期格式符