标签:java
在做消息中间件的开发中常常要生成唯一的消息的标识,可以根据项目部署的服务器加上相应的前缀,然后根据系统的 时间戳,时间戳太长了,可以转成36进制的字符串,便形成了消息的唯一标识:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class MsgIDUtil {
private static final int BASE_YEAR = 2013;
private static final long MILLISECOND_PER_DAY = 86400000L;
private static long lastTicketTime = 0l;
public static synchronized String generateTicketNumber(String prefix) {
if (prefix != null && prefix.trim().length() > 0) {
return prefix + generateTicketNumber();
}
return generateTicketNumber();
}
public static synchronized String generateTicketNumber() {
long givenTime = System.currentTimeMillis();
if (givenTime <= lastTicketTime) {
givenTime = lastTicketTime + 1;
}
String result = generateTicketNumber(givenTime);
lastTicketTime = givenTime;
return result;
}
protected static synchronized String generateTicketNumber(long givenTime) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(givenTime);
int year = cal.get(Calendar.YEAR);
int yearIndex = year - BASE_YEAR;
if (yearIndex < 0 || yearIndex > 36) {
throw new IllegalArgumentException("Input Time is earlier then "
+ BASE_YEAR + " or greater than " + BASE_YEAR + 36);
}
int dayOfYear = cal.get(Calendar.DAY_OF_YEAR);
// get base line of the time of the day
Calendar cal2 = Calendar.getInstance();
cal2.clear();
cal2.set(Calendar.YEAR, year);
cal2.set(Calendar.DAY_OF_YEAR, dayOfYear);
long baselineTime = cal2.getTimeInMillis();
StringBuilder sb = new StringBuilder();
sb.append(Integer.toString(yearIndex, 36));
String dayOfYearStr = Integer.toString(dayOfYear, 36);
for (int i = 0; i < (2 - dayOfYearStr.length()); i++) {
sb.append(0);
}
sb.append(dayOfYearStr);
String timeOfDayStr = Long.toString(givenTime - baselineTime, 36);
for (int i = 0; i < (6 - timeOfDayStr.length()); i++) {
sb.append(0);
}
sb.append(timeOfDayStr);
return sb.toString().toUpperCase();
}
public static long getTicketTime(String ticketNumber) {
if (ticketNumber == null || ticketNumber.trim().length() < 9 || ticketNumber.trim().length() > 10) {
throw new IllegalArgumentException("Input ID is not valid -->" + ticketNumber);
}
if (ticketNumber.trim().length() == 10) {
ticketNumber = ticketNumber.trim().substring(1);
}
int yearIndex = Integer.parseInt(ticketNumber.substring(0, 1), 36);
int dayIndex = Integer.parseInt(ticketNumber.substring(1, 3), 36);
long millIndex = Long.parseLong(ticketNumber.substring(3), 36);
if (dayIndex > 365 || millIndex > MILLISECOND_PER_DAY) {
throw new IllegalArgumentException("Can't parse the input Ticket number " + ticketNumber);
}
Calendar result = Calendar.getInstance();
result.clear();
result.set(Calendar.YEAR, BASE_YEAR + yearIndex);
result.set(Calendar.DAY_OF_YEAR, dayIndex);
return result.getTimeInMillis() + millIndex;
}
private static long getTimeFromStr(String dateValue, String dateFormat) throws ParseException {
SimpleDateFormat sdFormat = new SimpleDateFormat(dateFormat);
Date output = sdFormat.parse(dateValue);
return output.getTime();
}
protected static synchronized String generateTicketNumber(String dateValue, String dateFormat) throws ParseException {
long givenTime = getTimeFromStr(dateValue, dateFormat);
return generateTicketNumber(givenTime);
}
public static void main(String[] args) {
String newTicketNumber = generateTicketNumber("A");
System.out.println(newTicketNumber);
}
}标签:java
原文地址:http://blog.csdn.net/gufachongyang02/article/details/39504123