PHP的身份证号码工具类翻译的那个Java的

<?php
/**
 * 身份证工具类
 *
 * @author Tongle Xu <xutongle@gmail.com> 2013-6-6
 * @copyright Copyright (c) 2003-2103 tintsoft.com
 * @license http://www.php100.com
 * @version $Id$
 */
class Utils_Idcard {
	/**
	 * 中国公民身份证号码最小长度。
	 */
	const CHINA_ID_MIN_LENGTH = 15;

	/**
	 * 中国公民身份证号码最大长度。
	 */
	const CHINA_ID_MAX_LENGTH = 18;

	/**
	 * 最低年限
	 */
	const MIN = 1930;

	/**
	 * 省、直辖市代码表
	 */
	public static $cityCode = array ("11","12","13","14","15","21","22","23","31","32","33","34","35","36","37","41","42","43","44","45","46","50","51","52","53","54","61","62","63","64","65","71","81","82","91" );

	/**
	 * 每位加权因子
	 */
	public static $power = array (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 );

	/**
	 * 第18位校检码
	 */
	public static $verifyCode = array ("1","0","X","9","8","7","6","5","4","3","2" );
	/**
	 * 国内身份证校验
	 */
	public static $cityCodes = array ('11' => '北京' );

	/**
	 * 将15位身份证号码转换为18位
	 *
	 * @param idCard 15位身份编码
	 * @return 18位身份编码
	 */
	public static function conver15CardTo18($idCard) {
		$idCard18 = "";
		if (strlen ( $idCard ) != self::CHINA_ID_MIN_LENGTH) {
			return null;
		}
		if (self::isNum ( $idCard )) {
			// 获取出生年月日
			$sYear = '19' . substr ( $idCard, 6, 2 );
			$idCard18 = substr ( $idCard, 0, 6 ) . $sYear . substr ( $idCard, 8 );
			// 转换字符数组
			$iArr = str_split ( $idCard18 );
			if ($iArr != null) {
				$iSum17 = self::getPowerSum ( $iArr );
				// 获取校验位
				$sVal = self::getCheckCode18 ( $iSum17 );
				if (strlen ( $sVal ) > 0) {
					$idCard18 .= $sVal;
				} else {
					return null;
				}
			}
		} else {
			return null;
		}
		return $idCard18;
	}

	/**
	 * 验证身份证是否合法
	 */
	public static function validateCard($idCard) {
		$card = trim ( $idCard );
		if (self::validateIdCard18 ( $card )) {
			return true;
		}
		if (self::validateIdCard15 ( $card )) {
			return true;
		}
		return false;
	}

	/**
	 * 验证18位身份编码是否合法
	 *
	 * @param int $idCard 身份编码
	 * @return boolean 是否合法
	 */
	public static function validateIdCard18($idCard) {
		$bTrue = false;
		if (strlen ( $idCard ) == self::CHINA_ID_MAX_LENGTH) {
			// 前17位
			$code17 = substr ( $idCard, 0, 17 );
			// 第18位
			$code18 = substr ( $idCard, 17, 1 );
			if (self::isNum ( $code17 )) {
				$iArr = str_split ( $code17 );
				if ($iArr != null) {
					$iSum17 = self::getPowerSum ( $iArr );
					// 获取校验位
					$val = self::getCheckCode18 ( $iSum17 );
					if (strlen ( $val ) > 0 && $val == $code18) {
						$bTrue = true;
					}
				}
			}
		}
		return $bTrue;
	}

	/**
	 * 验证15位身份编码是否合法
	 *
	 * @param string $idCard 身份编码
	 * @return boolean 是否合法
	 */
	public static function validateIdCard15($idCard) {
		if (strlen ( $idCard ) != self::CHINA_ID_MIN_LENGTH) {
			return false;
		}
		if (self::isNum ( $idCard )) {
			$proCode = substr ( $idCard, 0, 2 );
			if (! isset ( self::$cityCodes [$proCode] )) {
				return false;
			}
			//升到18位
			$idCard = self::conver15CardTo18($idCard);
			return self::validateIdCard18($idCard);
		} else {
			return false;
		}
		return true;
	}

	/**
	 * 根据身份编号获取年龄
	 *
	 * @param string idCard 身份编号
	 * @return 年龄
	 */
	public static function getAgeByIdCard($idCard) {
		$iAge = 0;
		if (strlen ( $idCard ) == self::CHINA_ID_MIN_LENGTH) {
			$idCard = self::conver15CardTo18 ( $idCard );
		}
		$year = substr ( $idCard, 6, 4 );
		$iCurrYear = date ( 'Y', time () );
		$iAge = $iCurrYear - $year;
		return $iAge;
	}

	/**
	 * 根据身份编号获取生日天
	 *
	 * @param string $idCard 身份编号
	 * @return NULL string
	 */
	public static function getDateByIdCard($idCard) {
		$len = strlen ( $idCard );
		if ($len < self::CHINA_ID_MIN_LENGTH) {
			return null;
		} else if ($len == CHINA_ID_MIN_LENGTH) {
			$idCard = self::conver15CardTo18 ( $idCard );
		}
		return substr ( $idCard, 12, 2 );
	}

	/**
	 * 根据身份编号获取性别
	 *
	 * @param string $idCard 身份编号
	 * @return 性别(M-男,F-女,N-未知)
	 */
	public static function getGenderByIdCard($idCard) {
		$sGender = "N";
		if (strlen ( $idCard ) == self::CHINA_ID_MIN_LENGTH) {
			$idCard = self::conver15CardTo18 ( $idCard );
		}
		$sCardNum = substr ( $idCard, 16, 1 );
		if (( int ) $sCardNum % 2 != 0) {
			$sGender = "M";
		} else {
			$sGender = "F";
		}
		return $sGender;
	}

	/**
	 * 根据身份编号获取户籍省份
	 *
	 * @param string $idCard 身份编号
	 * @return string
	 */
	public static function getProvinceByIdCard($idCard) {
		$len = strlen ( $idCard );
		$sProvince = null;
		$sProvinNum = "";
		if ($len == self::CHINA_ID_MIN_LENGTH  $len == self::CHINA_ID_MAX_LENGTH) {
			$sProvinNum = substr ( $idCard, 0, 2 );
		}
		$sProvince = self::$cityCodes [$sProvinNum];
		return $sProvince;
	}

	/**
	 * 数字验证
	 *
	 * @param int $val
	 */
	public static function isNum($val) {
		return $val == null  $val == "" ? false : 0 < preg_match ( '/^[0-9]*$/', $val );
	}

	/**
	 * 验证小于当前日期 是否有效
	 *
	 * @param int $iYear 待验证日期(年)
	 * @param int $iMonth 待验证日期(月 1-12)
	 * @param int $iDate 待验证日期(日)
	 * @return 是否有效
	 */
	public static function valiDate($iYear, $iMonth, $iDate) {
		$year = date ( 'Y', time () );
		if ($iYear < self::MIN  $iYear >= $year) {
			return false;
		}
		if ($iMonth < 1  $iMonth > 12) {
			return false;
		}
		switch ($iMonth) {
			case 4 :
			case 6 :
			case 9 :
			case 11 :
				$datePerMonth = 30;
				break;
			case 2 :
				$dm = (($iYear % 4 == 0 && $iYear % 100 != 0)  ($iYear % 400 == 0)) && ($iYear > self::MIN && $iYear < $year);
				$datePerMonth = $dm ? 29 : 28;
				break;
			default :
				$datePerMonth = 31;
		}
		return ($iDate >= 1) && ($iDate <= $datePerMonth);
	}

	/**
	 * 将身份证的每位和对应位的加权因子相乘之后,再得到和值
	 *
	 * @param array $iArr
	 * @return 身份证编码。
	 */
	private static function getPowerSum($iArr) {
		$iSum = 0;
		$power_len = count ( self::$power );
		$iarr_len = count ( $iArr );
		if ($power_len == $iarr_len) {
			for($i = 0; $i < $iarr_len; $i ++) {
				for($j = 0; $j < $power_len; $j ++) {
					if ($i == $j) {
						$iSum = $iSum + $iArr [$i] * self::$power [$j];
					}
				}
			}
		}
		return $iSum;
	}

	/**
	 * 将power和值与11取模获得余数进行校验码判断
	 *
	 * @param int $iSum
	 * @return 校验位
	 */
	private static function getCheckCode18($iSum) {
		$sCode = "";
		switch ($iSum % 11) {
			case 10 :
				$sCode = "2";
				break;
			case 9 :
				$sCode = "3";
				break;
			case 8 :
				$sCode = "4";
				break;
			case 7 :
				$sCode = "5";
				break;
			case 6 :
				$sCode = "6";
				break;
			case 5 :
				$sCode = "7";
				break;
			case 4 :
				$sCode = "8";
				break;
			case 3 :
				$sCode = "9";
				break;
			case 2 :
				$sCode = "x";
				break;
			case 1 :
				$sCode = "0";
				break;
			case 0 :
				$sCode = "1";
				break;
		}
		return $sCode;
	}
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, php
, 工具
, 身份证
号码
java md5工具类、java 工具类、java 常用工具类、java http请求工具类、java工具类大全,以便于您获取更多的相关知识。

时间: 2024-12-31 21:44:04

PHP的身份证号码工具类翻译的那个Java的的相关文章

php身份证号码检查类实例_php技巧

本文实例讲述了php身份证号码检查类.分享给大家供大家参考.具体如下: <?php class CIDMaker // 声明一个身份证号码检查类 { var $id; var $err; var $idx = array(1,1,1,1,1,1,1,1,3,1,1,2,2,2,3,2,2,2,2,2,2,2,3,3,3,3); var $idy = array(0,1,2,3,4,5,6,7,4,8,9,0,1,2,5,3,4,5,6,7,8,9,0,1,2,3); function check

java身份证号码验证类

 代码如下 复制代码 package my.tools; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; /**  * 身份证工

翻翻git之---实用工具类Lazy(绝对的好东西,走过路过别错过)

转载请注明出处:这里写链接内容 今天还是继续昨天的从Git上找点"有用的","好玩的","推荐的"东西给大家,今天贴的是一个工具类.地址如下https://github.com/ddwhan0123/Lazy 原作者Blog:http://weibo.com/2675061813/profile?topnav=1&wvr=6 他有一些比较常用的,诸如设备状态啊,土司啊,窗口啊,测量啊什么的,还有些我觉得平时回去搜,但是不多的资源,如拼音和

数据库-java中的流属于工具类吗,还是属于一种数据类型?

问题描述 java中的流属于工具类吗,还是属于一种数据类型? 数据库存储的blob类型数据不应该是一串二进制数吗,为什么都说它是二进制流. 解决方案 工具类都在这个java.util中定义, 你看包就知道了 流是专门处理Io的. 有一套对应的类来支持它 数据库存储的blob类型数据不应该是一串二进制数吗,为什么都说它是二进制流 存储的数据是二进制数,但是这个二进制数的格式是某个对象的 这就是流对象. 你要通过流对象读出二进制数啊 这和你用流读取一个二进制文件是一样的 解决方案二: 流是一种抽象类

通用排序工具类

1,实际应用: Java代码   List<OrderInfoBean> orderInfoBeans = commitOrderDto.getValue();           SortList<OrderInfoBean> sortList = new SortList<OrderInfoBean>();           sortList.Sort(orderInfoBeans, "getCreateTime", "desc&qu

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

正文  慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实现签到 这次 我们实现 javaweb http json 交互 in action 题目很长,但我想让你们看下,给我点意见.   开始吧  实战  本次以经典的登录作为案例.登录做的好也是经典. 服务端 和 app端,服务端简略,app端详细介绍... 服务端 资料: <spring> @ResponseBody  将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,

Java 中按文件名称分类,按文件大小分类,按照文件类型分类,按照最后修改时间分类的工具类

在此博客中用到了文件操作的工具类,可以连接 Java中实现复制文件到文件,复制文件到文件夹,复制文件夹到文件,删除文件,删除文件夹,移动文件,移动文件夹的工具类 package cn.edu.hactcm.cfcms.utils; import java.io.File;import java.util.HashSet;import java.util.Set; import javax.swing.JOptionPane;/** * 文件分类中用到的所有工具类 * CFMS    :Compu

java正则表达式表单验证类工具类(验证邮箱、手机号码、qq号码等)_java

java使用正则表达式进行表单验证工具类,可以验证邮箱.手机号码.qq号码等 复制代码 代码如下: package util; import java.util.regex.Matcher;import java.util.regex.Pattern; /** * 使用正则表达式进行表单验证 *  */ public class RegexValidateUtil {    static boolean flag = false;    static String regex = ""

通过wps转换工具进行校验身份证号码

  如图1所示,A列为身份证号码(输入前请先将该列单元格格式统一设置成"文本"),B列为用公式从身份证号中提取出的出生日期,以B2为例,公式为: =TEXT(IF(LEN(A2)=15,"19",)&MID(A2,7,IF(LEN(A2)=18,8,6)),"####-##-##") 该公式利用文本函数,可智能判断18位和15位号码,并从中提取出出生日期. 在图1中,我们发现,由于输入错误,导致提取出的出生日期中出现了"1988