Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dm_project
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
姚本章
dm_project
Commits
d4c8f46a
Commit
d4c8f46a
authored
Nov 27, 2020
by
ysongq
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
no message
parent
f7bf4afb
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
574 additions
and
0 deletions
+574
-0
DateUtil.java
jz-dm-common/src/main/java/com/jz/common/utils/DateUtil.java
+134
-0
IdWorker.java
jz-dm-common/src/main/java/com/jz/common/utils/IdWorker.java
+171
-0
Page.java
jz-dm-common/src/main/java/com/jz/common/utils/Page.java
+233
-0
PageResult.java
...-common/src/main/java/com/jz/common/utils/PageResult.java
+36
-0
No files found.
jz-dm-common/src/main/java/com/jz/common/utils/DateUtil.java
0 → 100644
View file @
d4c8f46a
package
com
.
changgou
.
util
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.List
;
/***
*
* @Author:shenkunlin
* @Description:itheima
* @date: 2019/5/7 13:07
*
****/
public
class
DateUtil
{
//时间格式
public
static
final
String
PATTERN_YYYYMMDDHH
=
"yyyyMMddHH"
;
public
static
final
String
PATTERN_YYYY_MM_DDHHMMSS
=
"yyyy-MM-dd HH:mm:ss"
;
/***
* 从yyyy-MM-dd HH:mm格式转成yyyyMMddHH格式
* @param dateStr
* @return
*/
public
static
String
formatStr
(
String
dateStr
,
String
opattern
,
String
npattern
){
SimpleDateFormat
simpleDateFormat
=
new
SimpleDateFormat
(
opattern
);
try
{
Date
date
=
simpleDateFormat
.
parse
(
dateStr
);
simpleDateFormat
=
new
SimpleDateFormat
(
npattern
);
return
simpleDateFormat
.
format
(
date
);
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
/***
* 获取指定日期的凌晨
* @return
*/
public
static
Date
toDayStartHour
(
Date
date
){
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
date
);
calendar
.
set
(
Calendar
.
HOUR_OF_DAY
,
0
);
calendar
.
set
(
Calendar
.
MINUTE
,
0
);
calendar
.
set
(
Calendar
.
SECOND
,
0
);
calendar
.
set
(
Calendar
.
MILLISECOND
,
0
);
Date
start
=
calendar
.
getTime
();
return
start
;
}
/***
* 时间增加N分钟
* @param date
* @param minutes
* @return
*/
public
static
Date
addDateMinutes
(
Date
date
,
int
minutes
){
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
date
);
calendar
.
add
(
Calendar
.
MINUTE
,
minutes
);
// 24小时制
date
=
calendar
.
getTime
();
return
date
;
}
/***
* 时间递增N小时
* @param hour
* @return
*/
public
static
Date
addDateHour
(
Date
date
,
int
hour
){
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
date
);
calendar
.
add
(
Calendar
.
HOUR
,
hour
);
// 24小时制
date
=
calendar
.
getTime
();
return
date
;
}
/***
* 获取时间菜单
* @return
*/
public
static
List
<
Date
>
getDateMenus
(){
//定义一个List<Date>集合,存储所有时间段
List
<
Date
>
dates
=
getDates
(
12
);
//判断当前时间属于哪个时间范围
Date
now
=
new
Date
();
for
(
Date
cdate
:
dates
)
{
//开始时间<=当前时间<开始时间+2小时
if
(
cdate
.
getTime
()<=
now
.
getTime
()
&&
now
.
getTime
()<
addDateHour
(
cdate
,
2
).
getTime
()){
now
=
cdate
;
break
;
}
}
//当前需要显示的时间菜单
List
<
Date
>
dateMenus
=
new
ArrayList
<
Date
>();
for
(
int
i
=
0
;
i
<
5
;
i
++)
{
dateMenus
.
add
(
addDateHour
(
now
,
i
*
2
));
}
return
dateMenus
;
}
/***
* 指定时间往后N个时间间隔
* @param hours
* @return
*/
public
static
List
<
Date
>
getDates
(
int
hours
)
{
List
<
Date
>
dates
=
new
ArrayList
<
Date
>();
//循环12次
Date
date
=
toDayStartHour
(
new
Date
());
//凌晨
for
(
int
i
=
0
;
i
<
hours
;
i
++)
{
//每次递增2小时,将每次递增的时间存入到List<Date>集合中
dates
.
add
(
addDateHour
(
date
,
i
*
2
));
}
return
dates
;
}
/***
* 时间转成yyyyMMddHH
* @param date
* @param pattern
* @return
*/
public
static
String
data2str
(
Date
date
,
String
pattern
){
SimpleDateFormat
simpleDateFormat
=
new
SimpleDateFormat
(
pattern
);
return
simpleDateFormat
.
format
(
date
);
}
}
jz-dm-common/src/main/java/com/jz/common/utils/IdWorker.java
0 → 100644
View file @
d4c8f46a
package
com
.
changgou
.
util
;
import
java.lang.management.ManagementFactory
;
import
java.net.InetAddress
;
import
java.net.NetworkInterface
;
/**
* <p>名称:IdWorker.java</p>
* <p>描述:分布式自增长ID</p>
* <pre>
* Twitter的 Snowflake JAVA实现方案
* </pre>
* 核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:
* 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000
* 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,
* 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),
* 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
* 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),
* 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
* <p>
* 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
*
* @author Polim
*/
public
class
IdWorker
{
// 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
private
final
static
long
twepoch
=
1288834974657L
;
// 机器标识位数
private
final
static
long
workerIdBits
=
5L
;
// 数据中心标识位数
private
final
static
long
datacenterIdBits
=
5L
;
// 机器ID最大值
private
final
static
long
maxWorkerId
=
-
1L
^
(-
1L
<<
workerIdBits
);
// 数据中心ID最大值
private
final
static
long
maxDatacenterId
=
-
1L
^
(-
1L
<<
datacenterIdBits
);
// 毫秒内自增位
private
final
static
long
sequenceBits
=
12L
;
// 机器ID偏左移12位
private
final
static
long
workerIdShift
=
sequenceBits
;
// 数据中心ID左移17位
private
final
static
long
datacenterIdShift
=
sequenceBits
+
workerIdBits
;
// 时间毫秒左移22位
private
final
static
long
timestampLeftShift
=
sequenceBits
+
workerIdBits
+
datacenterIdBits
;
private
final
static
long
sequenceMask
=
-
1L
^
(-
1L
<<
sequenceBits
);
/* 上次生产id时间戳 */
private
static
long
lastTimestamp
=
-
1L
;
// 0,并发控制
private
long
sequence
=
0L
;
private
final
long
workerId
;
// 数据标识id部分
private
final
long
datacenterId
;
public
IdWorker
(){
this
.
datacenterId
=
getDatacenterId
(
maxDatacenterId
);
this
.
workerId
=
getMaxWorkerId
(
datacenterId
,
maxWorkerId
);
}
/**
* @param workerId
* 工作机器ID
* @param datacenterId
* 序列号
*/
public
IdWorker
(
long
workerId
,
long
datacenterId
)
{
if
(
workerId
>
maxWorkerId
||
workerId
<
0
)
{
throw
new
IllegalArgumentException
(
String
.
format
(
"worker Id can't be greater than %d or less than 0"
,
maxWorkerId
));
}
if
(
datacenterId
>
maxDatacenterId
||
datacenterId
<
0
)
{
throw
new
IllegalArgumentException
(
String
.
format
(
"datacenter Id can't be greater than %d or less than 0"
,
maxDatacenterId
));
}
this
.
workerId
=
workerId
;
this
.
datacenterId
=
datacenterId
;
}
/**
* 获取下一个ID
*
* @return
*/
public
synchronized
long
nextId
()
{
long
timestamp
=
timeGen
();
if
(
timestamp
<
lastTimestamp
)
{
throw
new
RuntimeException
(
String
.
format
(
"Clock moved backwards. Refusing to generate id for %d milliseconds"
,
lastTimestamp
-
timestamp
));
}
if
(
lastTimestamp
==
timestamp
)
{
// 当前毫秒内,则+1
sequence
=
(
sequence
+
1
)
&
sequenceMask
;
if
(
sequence
==
0
)
{
// 当前毫秒内计数满了,则等待下一秒
timestamp
=
tilNextMillis
(
lastTimestamp
);
}
}
else
{
sequence
=
0L
;
}
lastTimestamp
=
timestamp
;
// ID偏移组合生成最终的ID,并返回ID
long
nextId
=
((
timestamp
-
twepoch
)
<<
timestampLeftShift
)
|
(
datacenterId
<<
datacenterIdShift
)
|
(
workerId
<<
workerIdShift
)
|
sequence
;
return
nextId
;
}
private
long
tilNextMillis
(
final
long
lastTimestamp
)
{
long
timestamp
=
this
.
timeGen
();
while
(
timestamp
<=
lastTimestamp
)
{
timestamp
=
this
.
timeGen
();
}
return
timestamp
;
}
private
long
timeGen
()
{
return
System
.
currentTimeMillis
();
}
/**
* <p>
* 获取 maxWorkerId
* </p>
*/
protected
static
long
getMaxWorkerId
(
long
datacenterId
,
long
maxWorkerId
)
{
StringBuffer
mpid
=
new
StringBuffer
();
mpid
.
append
(
datacenterId
);
String
name
=
ManagementFactory
.
getRuntimeMXBean
().
getName
();
if
(!
name
.
isEmpty
())
{
/*
* GET jvmPid
*/
mpid
.
append
(
name
.
split
(
"@"
)[
0
]);
}
/*
* MAC + PID 的 hashcode 获取16个低位
*/
return
(
mpid
.
toString
().
hashCode
()
&
0xffff
)
%
(
maxWorkerId
+
1
);
}
/**
* <p>
* 数据标识id部分
* </p>
*/
protected
static
long
getDatacenterId
(
long
maxDatacenterId
)
{
long
id
=
0L
;
try
{
InetAddress
ip
=
InetAddress
.
getLocalHost
();
NetworkInterface
network
=
NetworkInterface
.
getByInetAddress
(
ip
);
if
(
network
==
null
)
{
id
=
1L
;
}
else
{
byte
[]
mac
=
network
.
getHardwareAddress
();
id
=
((
0x000000FF
&
(
long
)
mac
[
mac
.
length
-
1
])
|
(
0x0000FF00
&
(((
long
)
mac
[
mac
.
length
-
2
])
<<
8
)))
>>
6
;
id
=
id
%
(
maxDatacenterId
+
1
);
}
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
" getDatacenterId: "
+
e
.
getMessage
());
}
return
id
;
}
public
static
void
main
(
String
[]
args
)
{
//推特 26万个不重复的ID
IdWorker
idWorker
=
new
IdWorker
(
0
,
0
);
for
(
int
i
=
0
;
i
<
2600
;
i
++)
{
System
.
out
.
println
(
idWorker
.
nextId
());
}
}
}
\ No newline at end of file
jz-dm-common/src/main/java/com/jz/common/utils/Page.java
0 → 100644
View file @
d4c8f46a
package
com
.
changgou
.
util
;
import
java.io.Serializable
;
import
java.util.List
;
/*****
* @Author: 黑马训练营
* @Description: com.changgou.util
****/
public
class
Page
<
T
>
implements
Serializable
{
// 页数(第几页)
private
long
currentpage
;
// 查询数据库里面对应的数据有多少条
private
long
total
;
// 从数据库查处的总记录数
// 每页查5条
private
int
size
;
// 下页
private
int
next
;
private
List
<
T
>
list
;
// 最后一页
private
int
last
;
private
int
lpage
;
private
int
rpage
;
//从哪条开始查
private
long
start
;
//全局偏移量 6 7 8 9 10 11 12 13 14
public
int
offsize
=
2
;
public
Page
()
{
super
();
}
/****
*
* @param currentpage
* @param total
* @param pagesize
*/
public
void
setCurrentpage
(
long
currentpage
,
long
total
,
long
pagesize
)
{
//可以整除的情况下
long
pagecount
=
total
/
pagesize
;
//如果整除表示正好分N页,如果不能整除在N页的基础上+1页
int
totalPages
=
(
int
)
(
total
%
pagesize
==
0
?
total
/
pagesize
:
(
total
/
pagesize
)+
1
);
//总页数
this
.
last
=
totalPages
;
//判断当前页是否越界,如果越界,我们就查最后一页
if
(
currentpage
>
totalPages
){
this
.
currentpage
=
totalPages
;
}
else
{
this
.
currentpage
=
currentpage
;
}
//计算start
this
.
start
=
(
this
.
currentpage
-
1
)*
pagesize
;
}
//上一页
public
long
getUpper
()
{
return
currentpage
>
1
?
currentpage
-
1
:
currentpage
;
}
//总共有多少页,即末页
public
void
setLast
(
int
last
)
{
this
.
last
=
(
int
)
(
total
%
size
==
0
?
total
/
size
:
(
total
/
size
)+
1
);
}
/****
* 带有偏移量设置的分页
* @param total
* @param currentpage
* @param pagesize
* @param offsize
*/
public
Page
(
long
total
,
int
currentpage
,
int
pagesize
,
int
offsize
)
{
this
.
offsize
=
offsize
;
initPage
(
total
,
currentpage
,
pagesize
);
}
/****
*
* @param total 总记录数
* @param currentpage 当前页
* @param pagesize 每页显示多少条
*/
public
Page
(
long
total
,
int
currentpage
,
int
pagesize
)
{
initPage
(
total
,
currentpage
,
pagesize
);
}
/****
* 初始化分页
* @param total
* @param currentpage
* @param pagesize
*/
public
void
initPage
(
long
total
,
int
currentpage
,
int
pagesize
){
//总记录数
this
.
total
=
total
;
//每页显示多少条
this
.
size
=
pagesize
;
//计算当前页和数据库查询起始值以及总页数
setCurrentpage
(
currentpage
,
total
,
pagesize
);
//分页计算
int
leftcount
=
this
.
offsize
,
//需要向上一页执行多少次
rightcount
=
this
.
offsize
;
//起点页
this
.
lpage
=
currentpage
;
//结束页
this
.
rpage
=
currentpage
;
//2点判断
this
.
lpage
=
currentpage
-
leftcount
;
//正常情况下的起点
this
.
rpage
=
currentpage
+
rightcount
;
//正常情况下的终点
//页差=总页数和结束页的差
int
topdiv
=
this
.
last
-
rpage
;
//判断是否大于最大页数
/***
* 起点页
* 1、页差<0 起点页=起点页+页差值
* 2、页差>=0 起点和终点判断
*/
this
.
lpage
=
topdiv
<
0
?
this
.
lpage
+
topdiv:
this
.
lpage
;
/***
* 结束页
* 1、起点页<=0 结束页=|起点页|+1
* 2、起点页>0 结束页
*/
this
.
rpage
=
this
.
lpage
<=
0
?
this
.
rpage
+(
this
.
lpage
*-
1
)+
1
:
this
.
rpage
;
/***
* 当起点页<=0 让起点页为第一页
* 否则不管
*/
this
.
lpage
=
this
.
lpage
<=
0
?
1
:
this
.
lpage
;
/***
* 如果结束页>总页数 结束页=总页数
* 否则不管
*/
this
.
rpage
=
this
.
rpage
>
last
?
this
.
last
:
this
.
rpage
;
}
public
long
getNext
()
{
return
currentpage
<
last
?
currentpage
+
1
:
last
;
}
public
void
setNext
(
int
next
)
{
this
.
next
=
next
;
}
public
long
getCurrentpage
()
{
return
currentpage
;
}
public
long
getTotal
()
{
return
total
;
}
public
void
setTotal
(
long
total
)
{
this
.
total
=
total
;
}
public
long
getSize
()
{
return
size
;
}
public
void
setSize
(
int
size
)
{
this
.
size
=
size
;
}
public
long
getLast
()
{
return
last
;
}
public
long
getLpage
()
{
return
lpage
;
}
public
void
setLpage
(
int
lpage
)
{
this
.
lpage
=
lpage
;
}
public
long
getRpage
()
{
return
rpage
;
}
public
void
setRpage
(
int
rpage
)
{
this
.
rpage
=
rpage
;
}
public
long
getStart
()
{
return
start
;
}
public
void
setStart
(
long
start
)
{
this
.
start
=
start
;
}
public
void
setCurrentpage
(
long
currentpage
)
{
this
.
currentpage
=
currentpage
;
}
/**
* @return the list
*/
public
List
<
T
>
getList
()
{
return
list
;
}
/**
* @param list the list to set
*/
public
void
setList
(
List
<
T
>
list
)
{
this
.
list
=
list
;
}
}
\ No newline at end of file
jz-dm-common/src/main/java/com/jz/common/utils/PageResult.java
0 → 100644
View file @
d4c8f46a
package
com
.
changgou
.
util
;
import
java.util.List
;
/**
* 分页结果类
*/
public
class
PageResult
<
T
>
{
private
Long
total
;
//总记录数
private
List
<
T
>
rows
;
//记录
public
PageResult
(
Long
total
,
List
<
T
>
rows
)
{
this
.
total
=
total
;
this
.
rows
=
rows
;
}
public
PageResult
()
{
}
public
Long
getTotal
()
{
return
total
;
}
public
void
setTotal
(
Long
total
)
{
this
.
total
=
total
;
}
public
List
<
T
>
getRows
()
{
return
rows
;
}
public
void
setRows
(
List
<
T
>
rows
)
{
this
.
rows
=
rows
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment