js比较格式yyyy-mm-dd hh:mm:ss类型的时间的大小

比较时间格式并计算时间差
本文演示如何在JavaScript中比较两个时间格式为'yyyy-mm-dd hh:mm:ss'的日期字符串,并计算它们之间的小时差。代码示例清晰易懂。

<script>
//比较时间 格式 yyyy-mm-dd hh:mi:ss  

window.onload=function() {
 var beginTime = '2011-01-01 00:00:00';
 var endTime = '2011-01-01 00:00:01';

 var beginTimes=beginTime.substring(0,10).split('-'); 
 var endTimes=endTime.substring(0,10).split('-'); 
 beginTime=beginTimes[1]+'-'+beginTimes[2]+'-'+beginTimes[0]+' '+beginTime.substring(10,19); 
 endTime=endTimes[1]+'-'+endTimes[2]+'-'+endTimes[0]+' '+endTime.substring(10,19);
 var disparityTime =(Date.parse(endTime)-Date.parse(beginTime))/3600/1000; 
 var disparityTime =(Date.parse(endTime)-Date.parse(beginTime))/3600/1000; 
 if(disparityTime<0){ 
  alert("开始时间大"); 
 }else if (disparityTime>0){ 
  alert("结束时间大");
 }else if (disparityTime==0){ 
  alert("相等");
 }else{ 
  return "格式不对"; 
 } 
}
</script>

<think>我们使用FreeMarker模板引擎时,经常需要对日期时间进行格式化。在FreeMarker中,日期时间格式化可以通过内置的字符串函数或者使用`?string`指令来实现。但是,需要注意的是,FreeMarker支持三种日期时间类型:日期(仅年月日)、时间(仅时分秒毫秒)、日期时间(年月日时分秒)。 目标:在FreeMarker模板中将一个日期时间类型的变量格式化为 "yyyy-MM-dd HH:mm:ss" 的格式。 步骤: 1. 首先,确保在Java中传递给模板的日期对象是java.util.Date类型(或java.sql.Date, java.sql.Time, java.sql.Timestamp,这些也都是java.util.Date的子类),或者使用Java 8的日期时间类型(如LocalDateTime等),但FreeMarker默认只支持java.util.Date。如果使用Java 8的日期时间类型,需要额外配置。 2. 在FreeMarker模板中,我们可以使用`?string`来格式化日期。但是,为了统一格式,我们通常使用`?string("yyyy-MM-dd HH:mm:ss")`。 注意:小时部分,HH表示24小时制,hh表示12小时制。这里要求是24小时制,所以用HH。 但是,如果直接使用`?string("yyyy-MM-dd HH:mm:ss")`,可能会遇到一个问题:如果变量是日期类型(没有时间部分),那么时间部分会显示为00:00:00;如果是时间类型(没有日期部分),那么日期部分会显示为1970-01-01(或类似的默认日期)。因此,确保传入的是日期时间类型。 另外,FreeMarker在格式化日期时,还可以使用内置的格式化方式: - `?date`:只显示日期部分 - `?time`:只显示时间部分 - `?datetime`:显示日期和时间 但是,这些内置格式的显示形式取决于FreeMarker的配置(在Configuration中设置的日期格式)。我们可以通过设置默认的日期格式,但如果我们想要特定的格式,最好在模板中明确指定。 示例代码(在FreeMarker模板中): 假设我们有一个变量`myDate`,它是一个java.util.Date对象,包含日期和时间。 我们可以这样写: ${myDate?string("yyyy-MM-dd HH:mm:ss")} 但是,如果myDate为null,FreeMarker会抛出异常。为了避免异常,我们可以使用空值处理: ${myDate?string("yyyy-MM-dd HH:mm:ss")!} 或者使用默认值: ${myDate?string("yyyy-MM-dd HH:mm:ss")!''} 另外,在FreeMarker配置中,我们可以设置默认的日期格式,这样在模板中就不需要每次都指定格式。但是,如果某个地方需要不同的格式,还是需要单独指定。 配置示例(在Java代码中配置FreeMarker): Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setDateTimeFormat("yyyy-MM-dd HH:mm:ss"); 这样,在模板中就可以直接使用`${myDate?datetime}`来按照配置的格式输出了。但是,注意`?datetime`会同时输出日期和时间,而如果变量是日期类型,那么时间部分会是00:00:00;如果是时间类型,日期部分会是1970-01-01。所以,最好还是传递完整的日期时间对象。 针对Java 8的日期时间类型(如LocalDateTime): FreeMarker从2.3.23版本开始,支持Java 8的日期时间类型,但需要添加额外的依赖:`freemarker-java8`。在配置中,需要设置: cfg.setObjectWrapper(new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_30).build()); // 然后注册Java8的时间支持 cfg.setObjectWrapper(new freemarker.ext.beans.BeansWrapperBuilder(Configuration.VERSION_2_3_30).build()); // 但是实际上,从2.3.29版本开始,FreeMarker内置了Java8时间支持,我们可以这样: cfg.setObjectWrapper(new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_30).build()); // 然后,在模板中,我们可以使用同样的方式格式化,但是要注意,FreeMarker将Java8的日期时间类型视为没有时区的日期时间,因此格式化时不需要考虑时区(除非需要)。 但是,在模板中格式化Java8的日期时间类型,我们同样可以使用`?string`,例如: ${myLocalDateTime?string("yyyy-MM-dd HH:mm:ss")} 总结: 在FreeMarker模板中格式化日期时间为"yyyy-MM-dd HH:mm:ss"格式,可以使用: ${myDate?string("yyyy-MM-dd HH:mm:ss")} 注意:如果变量可能为null,请做好空值处理。 如果使用Java 8日期时间类型,请确保FreeMarker版本支持,并正确配置。 下面是一个完整的示例,展示如何在Java中配置FreeMarker以及如何在模板中使用: Java代码示例(配置FreeMarker):</think>在 FreeMarker 中格式时间类型为 `yyyy-MM-dd HH:mm:ss` 格式,需根据 Java 后端传入的时间对象类型选择正确的处理方式。以下是详细解决方案: ### 解决方案(FTL 模板代码) ```ftl <#-- 处理 java.util.Date 类型 --> ${utilDate?string("yyyy-MM-dd HH:mm:ss")} <#-- 处理 java.time.LocalDateTime 类型(需 FreeMarker 2.3.23+) --> ${localDateTime?string("yyyy-MM-dd HH:mm:ss")} <#-- 处理 java.time.OffsetDateTime 或 ZonedDateTime(带时区) --> ${offsetDateTime?string("yyyy-MM-dd HH:mm:ss")} <#-- 空值安全处理:当变量为 null 时输出空字符串 --> ${(optionalDate?string("yyyy-MM-dd HH:mm:ss"))!''} ``` ### 关键点解释 1. **`?string("pattern")` 是核心格式化函数** 通过指定模式字符串(如 `yyyy-MM-dd HH:mm:ss`)自定义输出格式- `yyyy`:四位年份 - `MM`:两位月份(01-12) - `dd`:两位日期(01-31) - `HH`:24小时制的小时(00-23) - `mm`:分钟(00-59) - `ss`:秒(00-59) 2. **时间类型兼容性** - **`java.util.Date`**:直接使用 `?string("pattern")` - **`java.time.*` 类型**(如 `LocalDateTime`):需 FreeMarker **2.3.23+** 版本支持 - **时区敏感类型**(如 `ZonedDateTime`):自动转换为当前时区时间输出 3. **空值安全处理** 使用 `(variable)!default` 语法避免变量为 `null` 时模板报错: ```ftl ${(myDate?string("yyyy-MM-dd HH:mm:ss"))!"N/A"} <#-- 输出 "N/A" 代替 null --> ``` 4. **格式易错点** - **12/24 小时制混淆**:`HH` 表示 24 小时制,`hh` 表示 12 小时制(易导致时间错误) - **大小写敏感**:`mm`(分钟) vs `MM`(月份),`ss`(秒) vs `SS`(毫秒) ### 后端 Java 代码示例 确保正确传递时间对象到模板: ```java // 示例:Spring Boot 控制器中传递时间对象 @Controller public class DemoController { @GetMapping("/report") public String showReport(Model model) { // 传递不同时间类型对象 model.addAttribute("utilDate", new Date()); model.addAttribute("localDateTime", LocalDateTime.now()); model.addAttribute("offsetDateTime", OffsetDateTime.now()); return "report-template"; } } ``` ### 常见问题排查 1. **格式化后输出乱码/问号** → 检查 FreeMarker 配置的编码(如 `UTF-8`)是否与页面一致: ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setDefaultEncoding("UTF-8"); ``` 2. **时间显示少 8 小时(时区问题)** → 显式设置时区(如东八区): ```ftl <#setting time_zone="Asia/Shanghai"> ``` 3. **报错 `Expected date or time`** → 检查变量是否实际为时间类型,或使用 `?datetime` 强制转换: ```ftl ${someString?datetime?string("yyyy-MM-dd HH:mm:ss")} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值