项目管理工具dhtmlxGantt甘特图入门教程(八):数据加载(三)

news2025/1/16 3:57:33

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理控件应用程序的所有需求,是最完善的甘特图图表库。 

这篇文章给大家讲解如何利用 dhtmlxGantt正确保存和显示任务的结束日期,本节将给你一个明确答案。

DhtmlxGantt正版试用下载(qun:764148812)https://www.evget.com/product/4213/download

首先,让我们考虑一下在处理任务日期时可能会遇到的两种情况:

方案1

  • 当任务持续时间以天为单位测量时 (duration_unit="day")
  • 当任务数据对象包含“%Y-%m-%d”或“%d-%m-%Y”格式的开始和结束日期时(即没有小时-分钟部分)

由于​​​​​​​dhtmlxGantt如何解释和存储任务结束日期的详细信息,结果日期可能具有不期望的值。

看看下面的例子:

gantt.parse({ tasks: [
{ 
id: 1,
text: "Task 1",
start_date: "22-12-2021",
end_date: "22-12-2021"
}
]}, links:[]);
console.log(gantt.getTask(1).end_date);
// 22 December 2021 00:00:00
console.log(gantt.getTask(1).duration);
// 0

在此示例中,开始日期和结束日期将引用相同的时间点,并且任务持续时间将为0。

方案2

  • 当任务的结束日期显示在网格中时
  • 并且结束日期的格式不包括小时-分钟部分

gantt.config.columns = [
{name: "text", label: "Name", tree: true, width: 200, resize: true},
{name: "duration", label: "Duration", width:80, align: "center", resize: true},
{name: "start_date", label: "Start", width:80, align: "center", resize: true},
{name: "end_date", label: "Finish", width:80, align: "center", resize: true}
];
gantt.init("gantt_here");
gantt.parse({ tasks: [
{ 
id: 1,
text: "Task 1",
start_date: "02-04-2020",
end_date: "02-04-2020"
}
]}, links:[]);

在此示例中,完成日期(任务的结束日期)指定为4月3日,而任务本身在4月2日结束。

我们将在下面解释甘特图如何存储结束日期的详细信息。

甘特图如何存储结束日期?

即使您没有指定任务日期的小时-分钟部分(duration_unit = "day"),dhtmlxGantt 也始终将其保存为 JS Date,它在客户端具有小时-分钟-秒-毫秒部分。

结束日期的当前格式如下:

  • 日期的秒和毫秒部分始终为0,甘特图不支持小于1分钟的单位
  • 任务的结束日期被指定为最后一个忙碌日(“日-时-分”)之后的一天的开始(“日-时-分”)。是:

从4月2日开始并持续 1 天的任务将具有以下开始和结束日期:"02-04-2022 00:00:00 - 03-04-2022 00:00:00"。结束日期将与4月2日之后一天的开始日期一致

从4月2日 13:00 开始并持续 1 小时的任务将具有以下开始和结束日期:“02-04-2022 13:00:00 - 02-04-2022 14:00:00” . 结束日期将匹配下一小时开始的日期

如果我们在屏幕上显示任务的结束日期而不设置时分部分,结果可能会产生误导。在场景 2的示例中,开始日期和结束日期将类似于“02-04-2022 - 03-04-2022”。这会让你认为任务持续时间不是1天,而是2天(从4月2日到3日)。

这是默认行为,它可能会让您感到困惑,但可以通过配置修复它。在接下来的部分中,我们将向您展示如何处理它的几种方法。

如何更改默认行为?

1)您不应该首先更改存储在甘特图中的实际任务日期。

您可能还想修改加载到甘特图中的任务日期,即将结束日期指定为 02-04-2022 23:59:59。但是你最好不要这样做,因为这样的决定可能会与任务持续时间的计算和自动调度相冲突。

相反,我们建议您使用以下方法:

2a)要更改甘特图中任务结束日期的格式(即在任务持续时间中包含结束日期),您可以重新定义task_end_date 模板。

让我们以2020年4月2日开始并持续一天的任务为例,考虑模板如何更改结束日期。

默认情况下,此任务的结束日期应显示为2020年4月3日(03-04-2020 00:00:00):

但是如果您应用task_end_date模板,则相同的任务将在2020年4月2日完成:

代码如下所示:

<// override the columns config
  gantt.config.columns = [
{name: "wbs", label: "#", width: 60, align: "center", template: gantt.getWBSCode},
{name: "text", label: "Name", tree: true, width: 200, resize: true},
{name: "start_date", label: "Start", width:80, align: "center", resize: true},
{name: "end_date", label: "Finish", width:80, align: "center", resize: true}, 
{name:"add"}
];
// redefine the template
gantt.templates.task_end_date = function(date){
return gantt.templates.task_date(new Date(date.valueOf() - 1)); 
};
var gridDateToStr = gantt.date.date_to_str("%Y-%m-%d");
gantt.templates.grid_date_format = function(date, column){
if(column === "end_date"){
return gridDateToStr(new Date(date.valueOf() - 1)); 
}else{
return gridDateToStr(date); 
}
}
gantt.init("gantt_here");

通过这种方式,您可以更改网格中显示的任务结束日期、灯箱的标题以及您需要显示结束日期的任何其他位置。

如果您正在使用任务的包含结束日期的格式并希望使其与网格中的内联编辑正常工作,则必须创建一个特殊的编辑器来编辑任务的包含结束日期,如下所示:

// inclusive editor for end dates
// use the default editor, but override the set_value/get_value methods
var dateEditor = gantt.config.editor_types.date;
gantt.config.editor_types.end_date = gantt.mixin({
    set_value: function(value, id, column, node){
        var correctedValue = gantt.date.add(value, -1, "day");
        return dateEditor.set_value.apply(this, [correctedValue, id, column, node]);
    },
    get_value: function(id, column, node) {
        var selectedValue = dateEditor.get_value.apply(this, [id, column, node]);
        return gantt.date.add(selectedValue, 1, "day");
    },
}, dateEditor);
 
var textEditor = {type: "text", map_to: "text"};
var startDateEditor = {type: "date", map_to: "start_date"};
var endDateEditor = {type: "end_date", map_to: "end_date"};
var durationEditor = {type: "number", map_to: "duration", min:0, max: 100};
 
gantt.config.columns = [
    {name: "text", label: "Name", tree: true, width: 200, editor: textEditor, 
        resize: true},
    {name: "duration", label: "Duration", width:80, align: "center", 
        editor: durationEditor, resize: true},
    {name: "start_date", label: "Start", width:140, align: "center", 
        editor: startDateEditor, resize: true},
    {name: "end_date", label: "Finish", width:140, align: "center", 
        editor: endDateEditor, resize: true}
];
 
// change lightbox and grid templates to display dates of tasks in an inclusive format
gantt.templates.task_end_date = function(date){
    return gantt.templates.task_date(new Date(date.valueOf() - 1)); 
};
 
var gridDateToStr = gantt.date.date_to_str("%Y-%m-%d");
gantt.templates.grid_date_format = function(date, column){
    if(column === "end_date"){
        return gridDateToStr(new Date(date.valueOf() - 1)); 
    }else{
        return gridDateToStr(date); 
    }
}

2b)如果应用程序的其他部分要求以“包含”格式存储结束日期,即从2020年4 月2日开始并持续一天的任务需要使用start_date存储:“02-04- 2022", end_date: "02-04-2022" - 您必须对结束日期进行额外处理,即:

  • 在将数据加载到甘特图之前向结束日期添加一天
  • 在将从甘特图收到的更改保存回数据存储之前从结束日期中减去一天

了解更多DhtmlxGantt相关内容和资讯,欢迎在线咨询或者私信我获取正版试用版及报价。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

异常-捕获业务异常踩坑记录

事情是这样&#xff0c;用了google的一个本地缓存框架&#xff0c;就是在查询数据的时候如果有就取缓存&#xff0c;没有就发http请求调接口&#xff0c;但是http请求也会有查询失败的时候&#xff0c;查询失败就会手动抛一个业务异常&#xff0c;然后我会在外层各种捕获异常&a…

三消游戏查找算法的原理和实现

本文首发于公众号&#xff1a; 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。今天这篇文章分享一下三消查找算法的原理和实现&#xff0c;其实三消的机制最早源于《宝石方块》…

无联不成春,2023创宇网安春联展!

春 联 又叫“春贴”“门对”“对联” 它以对仗工整、简洁精巧的文字 描绘美好形象&#xff0c;寄托美好愿望 是中国独特的文学形式 网络安全的列车已驶入2023&#xff0c;癸卯兔年新春将至&#xff01; 热爱中华优秀传统文化的创宇人&#xff0c;也纷纷以春联为载体&…

大网进阶安全刷题讲解(带答案)(1)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.大网进阶安全刷题 前言 本章将会讲解大网进阶安全刷题讲解。 一.大网进阶…

测试开发 | AppCrawler 自动遍历测试实践(二):定制化配置

本文为霍格沃兹测试学院学院学员课程 AppCrawler 学习笔记&#xff0c;文末加群一起学习交流。 定制化配置 自动遍历测试技术以及工具该如何选择和快速入门&#xff1f;经过对比和需求&#xff0c;最终选择测试架构师思寒大佬的 AppCrawler 作为自动遍历测试的工具。以下就分享…

LeetCode 112. 路径总和

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 112. 路径总和&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 112…

Cadence PCB仿真使用Allegro PCB SI按照指定的规则自动创建差分对方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI按照指定的规则自动创建差分的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可…

在使用示波器时,为什么有些波形感觉一直在晃?

我们可以从三个角度进行分析&#xff1a; 采样分析&#xff1a; 1、示波器采样信号的过程如上图&#xff1a;采样——处理——采样——处理。 2、处理时间也称死区时间&#xff0c;死区时间内示波器不监测输入信号。 3、提高波形刷新率&#xff0c;实质上是减少了死区时间&…

MyBatis-Plus数据安全保护(配置安全)

SpringBootMyBatis-Plus配置安全 1.该功能为了保护数据库配置及数据安全&#xff0c;在一定的程度上控制开发人员流动导致敏感信息泄露2.加密配置 mpw: 开头紧接加密内容&#xff08; 非数据库配置专用 YML 中其它配置也是可以使用的 &#xff09;3.随机密钥请负责人妥善保管&a…

设计模式_创建型模式 -《原型模式》

设计模式_创建型模式 -《原型模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 原型模式 (Prototype Pattern) &#xff1a;用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建…

Kafka的相关知识

一. Kafka基本介绍 Kafka是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统。具有&#xff1a;高吞吐量、低延迟、可扩展性、持久性、可靠性、容错性、高并发等特性。常见的…

RabbitMQ(五)常见面试题

目录1. 什么是 RabbitMQ&#xff1f;2.为什么要使用 RabbitMQ&#xff1f;3.使用 RabbitMQ 的场景4.如何确保消息正确地发送至 RabbitMQ&#xff1f;如何确保消息接收方消费了消息&#xff1f;5.如何避免消息重复投递或重复消费&#xff1f;6.消息基于什么传输&#xff1f;7.消…

基于java ssm springboot网上蛋糕商城项目设计和实现

基于java ssm springboot网上蛋糕商城项目设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

CAD中还能装ArcGIS?还能加载影像?定义坐标系?

时常我们需要CAD中插入影像 需要CAD数据转换GIS数据 需要CAD加载GIS数据 需要将CAD与GIS数据套库 却被坐标系搞蒙了 今天&#xff0c;我们就来解决以上的问题&#xff0c;介绍一款免费的ArcGIS插件——ArcGIS for AutoCAD。 这个模块插件可以直接访问在线地图。直接在CAD中…

Java实验——定义一个表示学生信息的类Student,要求如下:

一、题目要求 定义一个表示学生信息的类Student&#xff0c;要求如下&#xff1a; &#xff08;1&#xff09;类Student的成员变量&#xff1a; sNO 表示学号&#xff1b;sName表示姓名&#xff1b;sSex表示性别&#xff1b;sAge表示年龄&#xff1b;sJava&#xff1a;表示…

测试开发 | 如何模拟真实使用场景?mock 技术来帮你

mock 是一种通过代理修改请求与响应&#xff0c;从而辅助构造更多应用场景的工具。比如在工作中&#xff0c;可能需要 mock 第三方的回调给到测试人员测试的环境&#xff0c;从而更顺利的开展测试工作&#xff0c;也使得测试环境更接近真实的使用场景。Charles 修改请求与响应M…

Android自定义时间选择器

效果图 一、添加NumberPicker开源库 需要添加以下控件 仓库地址&#xff1a; https://github.com/ShawnLin013/NumberPicker implementation io.github.ShawnLin013:number-picker:2.4.13 二、 添加弹出框主题样式 在drawable文件夹下新建一个bg_bottom_dialog.xml&…

jenkins结合gitlable企业集成部署实战

简介 Jenkins是一个开源软件项目&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成 1.0 …

新的跨平台渲染引擎:Ab3d.DXEngine 5.2 Crack

用于 WPF 和 WinForms 的 DirectX 11 3D 渲染引擎 Ab3d.DXEngine 是一种超快的 3D 渲染引擎&#xff0c;可用于 .Net 桌面应用程序。采集 by Ω578867473 Ab3d.DXEngine采用超快的多线程渲染技术&#xff0c;可以充分利用显卡&#xff0c;提供与使用C时几乎相同的极致性能。 该…

javaEE 初阶 — 线程安全的集合类

文章目录1. 多线程环境使用 ArrayList多线程使用队列3. 多线程环境使用哈希表3.1 Hashtable3.2 ConcurrentHashMap4. 相关面试题1. 多线程环境使用 ArrayList java 标准库里的大部分集合类都是 “线程不安全” 的。 多个线程使用同一个集合类对象&#xff0c;很有可能会出问题。…