bootstrap table中时间戳转为datetime格式显示

本文介绍了一种在使用Bootstrap框架的项目中,将数据库中的时间戳字段转换为易读的日期格式的方法。通过在前端代码中添加特定的函数,可以将原本显示为长数字的时间戳转换为标准的年月日时分秒格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做项目用的是bootstrap框架,有遇到了数据类型转换的问题,数据库字段用的是时间戳类型,在数据库显示出来是年月日时分秒的形式,而在页面上显示却是一串很长的数字,这个时候别慌,一招解决,超简单~

 

页面显示:

解决办法:

代码片段1:

 { field:'reserveTime',title:'入驻时间',align: 'center',valign: 'middle',
                sortable: true,
                //——修改——获取日期列的值进行转换
                formatter: function (value, row, index) {
                    return changeDateFormat(value)
                }

代码片段2:

//转换日期格式(时间戳转换为datetime格式)
function changeDateFormat(cellval) {
    var dateVal = cellval + "";
    if (cellval != null) {
        var date = new Date(parseInt(dateVal.replace("/Date(", "").replace(")/", ""), 10));
        var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
        var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();

        var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
        var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
        var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();

        return date.getFullYear() + "-" + month + "-" + currentDate + " " + hours + ":" + minutes + ":" + seconds;
    }
}

就这样加上相关代码就可以了,重启一下服务器就行了,亲测有效。

如果只想要显示年月日只需要在最后的返回值中把所得的时分秒的相关代码删除即可。

 

<think>我们之前已经讨论过Flink读取Elasticsearch增量数据的两种方法:一种是通过外部工具(如Logstash或Debezium)捕获MySQL变更并写入Kafka,再由Flink消费;另一种是直接定时查询Elasticsearch。现在用户的问题是关于数据中台如何获取Elasticsearch的增量和全量数据。注意,用户特别提到“数据中台”,因此我们要从数据中台架构的角度来考虑。数据中台通常需要从各种数据源(包括Elasticsearch)获取全量和增量数据,以便进行数据整合、加工和服务。获取Elasticsearch数据的方法可以概括如下:1.全量数据获取:一次性读取索引中的所有数据。可以通过Elasticsearch的ScrollAPI或新的Point-in-Time(PIT)API实现。2.增量数据获取:获取自上次同步后新增或修改的数据。由于Elasticsearch本身没有内置的CDC机制,常用的方法有:-使用时间戳字段(如update_time)进行范围查询(适合按时间顺序写入的数据)。-使用ES的更改日志插件(如通过Elasticsearch的Logstash插件实现)。-结合其他工具(如Debezium+Kafka)捕获上游数据库变更,然后同步到ES,再通过Flink等处理。由于用户提到了“示例代码”和“配置教程”,我们将分别提供全量和增量数据获取的示例。注意:以下示例代码基于Java(因为Flink主要使用Java/Scala)和Python(使用Logstash配置)。方法一:全量数据获取(使用ScrollAPI)示例代码(JavaHighLevelRestClient):```java//创建RestHighLevelClientRestHighLevelClientclient=newRestHighLevelClient(RestClient.builder(newHttpHost("localhost",9200,"http")));SearchRequestsearchRequest=newSearchRequest("index_name");SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchAllQuery());searchSourceBuilder.size(100);searchRequest.source(searchSourceBuilder);//使用ScrollfinalScrollscroll=newScroll(TimeValue.timeValueMinutes(1L));searchRequest.scroll(scroll);SearchResponsesearchResponse=client.search(searchRequest,RequestOptions.DEFAULT);StringscrollId=searchResponse.getScrollId();SearchHit[]hits=searchResponse.getHits().getHits();while(hits!=null&&hits.length>0){//处理这一批hits//...//获取下一批SearchScrollRequestscrollRequest=newSearchScrollRequest(scrollId);scrollRequest.scroll(scroll);searchResponse=client.scroll(scrollRequest,RequestOptions.DEFAULT);scrollId=searchResponse.getScrollId();hits=searchResponse.getHits().getHits();}//清除scrollClearScrollRequestclearScrollRequest=newClearScrollRequest();clearScrollRequest.addScrollId(scrollId);client.clearScroll(clearScrollRequest,RequestOptions.DEFAULT);client.close();```方法二:增量数据获取(基于时间戳)假设数据中有一个字段`update_time`,存储了数据更新的时间戳。我们每次同步时记录上次同步的最大时间戳,然后查询大于这个时间戳的数据。示例代码(Java):```java//查询条件:update_time大于上次同步的最大时间戳longlastMaxTime=...;//从存储中读取上次同步的最大时间戳SearchRequestsearchRequest=newSearchRequest("index_name");SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.rangeQuery("update_time").gt(lastMaxTime));searchRequest.source(searchSourceBuilder);SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//处理结果,并更新lastMaxTime```方法三:使用Logstash进行全量和增量同步Logstash可以配置全量和增量同步。以下是一个配置示例(logstash.conf),它使用jdbc输入插件从MySQL读取数据并写入ES。这里我们通过`sql_last_value`来实现增量同步。配置示例:```rubyinput{jdbc{jdbc_connection_string=>"jdbc:mysql://localhost:3306/db"jdbc_user=>"user"jdbc_password=>"password"#全量同步:首次执行时,sql_last_value为0;之后增量同步statement=>"SELECT*FROMtableWHEREupdate_time>:sql_last_value"use_column_value=>truetracking_column=>"update_time"tracking_column_type=>"numeric"#定时执行(每分钟)schedule=>"*****"}}output{elasticsearch{hosts=>["http://localhost:9200"]index=>"index_name"document_id=>"%{id}"}}```方法四:通过FlinkCDC捕获MySQL变更并写入ES,然后数据中台从ES中读取(间接方法)如果数据中台需要获取ES的增量数据,也可以通过Flink消费MySQL变更(使用Debezium作为CDC工具),然后写入ES。这样,数据中台既可以从ES获取全量数据(直接查询),也可以获取增量数据(通过监听Flink写入ES的实时流,或者通过上面提到的时间戳方式)。在Flink中,我们可以使用FlinkSQL轻松实现:```sql--使用FlinkSQL创建MySQLCDC表CREATETABLEmysql_source(idINT,nameSTRING,update_timeTIMESTAMP(3))WITH('connector'='mysql-cdc','hostname'='localhost','port'='3306','username'='root','password'='password','database-name'='mydb','table-name'='mytable');--创建ESSink表CREATETABLEes_sink(idINT,nameSTRING,update_timeTIMESTAMP(3))WITH('connector'='elasticsearch-7','hosts'='http://localhost:9200','index'='index_name');--将数据从MySQL同步到ESINSERTINTOes_sinkSELECT*FROMmysql_source;```这样,数据中台就可以直接查询ES中的全量数据,而增量数据则可以通过Flink的实时流获取(例如数据中台作为Flink作业的消费者,消费变更流)或者通过ES的时间戳字段获取。总结:数据中台获取Elasticsearch的全量数据:直接通过ScrollAPI或SearchAPI(数据量不大时)查询索引的所有数据。获取增量数据:推荐使用时间戳字段查询(需要数据有时间戳且更新时维护该字段),或者通过中间数据流(如Flink)捕获变更。根据数据中台的架构,也可以考虑将ES的数据同步到数据湖(如HDFS)或数据仓库(如Hive),再通过数据湖或数据仓库提供数据服务。注意:由于ES本身不是为批量分析设计的,全量导出大数据量可能会影响集群性能。以下是生成的相关问题:§§相关问题§§1.如何优化从Elasticsearch中导出大量数据(全量)的性能?2.数据中台在获取Elasticsearch增量数据时,如何保证数据的一致性?3.在数据中台架构中,是否有必要将Elasticsearch作为原始数据存储?4.如何通过Flink实现Elasticsearch到其他存储系统(如HBase)的数据同步?5.如何监控Elasticsearch数据同步任务的运行状态?</think> ### 数据中台获取 Elasticsearch 全量/增量数据的解决方案 数据中台获取 Elasticsearch 数据时,需要根据场景选择**全量(初始同步)**或**增量(持续变更同步)**方案。以下是具体实现方法和示例: --- ### 一、全量数据同步方案 适用于首次数据迁移或重建索引场景。 #### 方法 1:使用 Logstash JDBC 输入插件 **配置文件 `logstash-fullsync.conf`**: ```ruby input { jdbc { jdbc_connection_string => "jdbc:mysql://mysql-host:3306/mydb" jdbc_user => "root" jdbc_password => "password" statement => "SELECT * FROM products" # 全表查询 } } output { elasticsearch { hosts => ["http://es-node1:9200", "http://es-node2:9200"] index => "products_full" document_id => "%{id}" # 主键映射 } } ``` **执行命令**: ```bash ./bin/logstash -f logstash-fullsync.conf ``` > **原理**:扫描 MySQL 全表数据写入 ES[^2]。 #### 方法 2:Elasticsearch Reindex API ```bash # 将源索引数据复制到新索引 POST _reindex { "source": { "index": "products_old" }, "dest": { "index": "products_new" } } ``` > **适用场景**:ES 集群内部索引迁移[^3]。 --- ### 二、增量数据同步方案 适用于实时捕获数据变更的场景。 #### 方法 1:Binlog + Canal + Flink ![增量同步架构](https://miro.medium.com/max/1400/1*0UO08dCq6v2uQfB9K8VzJg.png) 1. **Canal 配置**(`canal.properties`): ```properties canal.serverMode = kafka # 输出到 Kafka kafka.bootstrap.servers = kafka-host:9092 canal.destinations = products_canal ``` 2. **Flink SQL 作业**: ```sql -- 创建 Kafka 源表(Canal 的 JSON 格式) CREATE TABLE mysql_products ( id BIGINT, name STRING, price DECIMAL(10,2), update_time TIMESTAMP(3), PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'kafka', 'topic' = 'products_canal', 'properties.bootstrap.servers' = 'kafka-host:9092', 'format' = 'canal-json' -- 解析 Binlog 格式 ); -- 创建 ES 目标表 CREATE TABLE es_products ( id BIGINT, name STRING, price DECIMAL(10,2), update_time TIMESTAMP(3), PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'elasticsearch-7', 'hosts' = 'http://es-node1:9200', 'index' = 'products_incr', 'sink.flush-on-checkpoint' = 'true' ); -- 持续增量写入 INSERT INTO es_products SELECT id, name, price, update_time FROM mysql_products; ``` > **原理**:Canal 捕获 MySQL Binlog → Kafka → Flink 实时写入 ES[^4][^5]。 #### 方法 2:基于时间戳的增量查询 ```python from elasticsearch import Elasticsearch from datetime import datetime es = Elasticsearch(["http://es-host:9200"]) last_timestamp = "2023-01-01T00:00:00" # 上次同步时间点 # 查询更新时间大于阈值的数据 query = { "query": { "range": { "update_time": {"gte": last_timestamp} } } } result = es.search(index="products", body=query) for hit in result["hits"]["hits"]: process_data(hit["_source"]) # 处理增量数据 last_timestamp = max(last_timestamp, hit["_source"]["update_time"]) ``` --- ### 三、关键注意事项 1. **数据一致性保障**: - 增量同步需启用 Flink Checkpoint 保证 exactly-once[^5] ```java env.enableCheckpointing(60000); // 1分钟一次 Checkpoint ``` 2. **性能优化**: - ES 写入批处理:`sink.bulk-flush.max-actions=500` - 索引分片设计:根据数据规模设置合理分片数 3. **字段映射**: - MySQL 的 `DATETIME` → ES 的 `date` 类型 - MySQL 的 `DECIMAL` → ES 的 `scaled_float` --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值