之前有个Q上好友没事问我,怎么自己写Unix时间戳转日期时间?于是我就顺手写了个C#版本给他!最近想起来,就萌发多写几个语言的版本分享,权当练习思路外加熟悉另外两种语言。

先说转换步骤

  1. 先处理年份,从1970年开始处理,根据平年闰年的总秒数,先得到年,剩余的秒数再求月份;
  2. 根据剩余秒数求得月份,因为2月的缘故,同样需要处理平年闰年‘;
  3. 得天数,直接除以每天的总秒数,然后取得天;
  4. 取小时、分钟、秒;

Python版本:

# -*- coding: UTF-8 -*-
from datetime import datetime, tzinfo, timedelta
import pytz class DateHelper:
def unixTimestmpToDate(self,timestamp):
#计算年
(remainSeconds,year) = self.__get_year(timestamp)
(remainSeconds,month) = self.__get_month(remainSeconds,year)
(remainSeconds,day) = self.__get_day(remainSeconds)
(remainSeconds,hour) = self.__get_hour(remainSeconds)
(remainSeconds,minute) = self.__get_minute(remainSeconds) result = datetime(year, month, day, hour, minute, remainSeconds, 0, UTC(8)) print result.strftime('%Y-%m-%d %H:%M:%S',) def __get_minute(self,timestamp):
"""
计算分钟
"""
min = timestamp / 60 return (timestamp - min * 60, min) def __get_hour(self,timestamp):
"""
计算小时
"""
hour = timestamp / (60 * 60) return (timestamp - hour * 60 * 60, hour) def __get_day(self,timestamp):
"""
计算天
"""
#每天的秒数
daySeconds = 24 * 60 * 60 day = timestamp / daySeconds return (timestamp - day * daySeconds, day + 1) def __get_month(self, timestamp, year):
"""
计算月份
"""
#每天的秒数
daySeconds = 24 * 60 * 60
#每月的总秒数
monthDays = [31 * daySeconds, 28 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds] if self.__is_leap_year(year):
monthDays[1] = 29 * daySeconds totalSeconds = 0
month = 0
for second in monthDays:
month +=1
if second + totalSeconds > timestamp:
break totalSeconds += second return (timestamp - totalSeconds, month) def __get_year(self,timestamp):
"""
计算年份
"""
year = 1969
totalSeconds = 0 while True:
year +=1
second = self.__get_year_seconds(year)
#年份总秒数大于时间戳
if totalSeconds + second > timestamp:
break totalSeconds += second return (timestamp - totalSeconds,year) def __get_year_seconds(self,year):
'''
得到每一年的总秒数
'''
isLeapYear = self.__is_leap_year(year) if isLeapYear:
return 366 * 24 * 60 * 60
else:
return 365 * 24 * 60 * 60 def __is_leap_year(self,year):
'''
判断是否闰年
'''
if year % 4 == 0 and year % 100 != 0:
return True
elif year % 400 == 0:
return True
else:
return False class UTC(tzinfo):
"""UTC 时区创建"""
def __init__(self,offset=0):
self._offset = offset def utcoffset(self, dt):
return timedelta(hours=self._offset) def tzname(self, dt):
return "UTC +%s" % self._offset def dst(self, dt):
return timedelta(hours=self._offset) if __name__ == "__main__":
datehelper = DateHelper()
datehelper.unixTimestmpToDate(1483200000)

C#版本:

class DateHelper
{
/// <summary>
/// unix时间戳转时间
/// </summary>
/// <param name="timestamp">时间戳</param>
/// <returns></returns>
public static DateTime UixTimestmpToDate(int timestamp)
{
int remainSeconds;
int year = GetYear(timestamp, out remainSeconds); int seconds = remainSeconds;
int month = GetMonth(seconds, year, out remainSeconds); // seconds = remainSeconds;
int day = GetDay(remainSeconds, out remainSeconds);
int hour = GetHours(remainSeconds, out remainSeconds);
int minute = GetMinute(remainSeconds, out remainSeconds); return new DateTime(year, month, day, hour, minute, remainSeconds);
} /// <summary>
/// 计算分钟
/// </summary>
/// <param name="timestamp"></param>
/// <param name="remainSeconds">剩余秒数</param>
/// <returns></returns>
private static int GetMinute(int timestamp, out int remainSeconds)
{
var minute = timestamp / ; remainSeconds = timestamp - minute * ; return minute;
} /// <summary>
/// 计算小时
/// </summary>
/// <param name="timestamp"></param>
/// <param name="remainSeconds"></param>
/// <returns></returns>
private static int GetHours(int timestamp, out int remainSeconds)
{
var hour = timestamp / ( * ); remainSeconds = timestamp - hour * * ; return hour;
} /// <summary>
/// 计算日
/// </summary>
/// <param name="timestamp"></param>
/// <param name="remainSeconds"></param>
/// <returns></returns>
private static int GetDay(int timestamp, out int remainSeconds)
{
var daySeconds = * * ; var day = timestamp / daySeconds; remainSeconds = timestamp - day * daySeconds; return day + ;
} /// <summary>
/// 计算月
/// </summary>
/// <param name="timestamp"></param>
/// <param name="year"></param>
/// <param name="remainSeconds"></param>
/// <returns></returns>
private static int GetMonth(int timestamp, int year, out int remainSeconds)
{
// 每天的秒数
var daySeconds = * * ;
//每月的总秒数
var monthDays = new int[] { * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds }; if (IsLeepYear(year))
monthDays[] = * daySeconds; var totalSeconds = ;
var month = ;
foreach (var second in monthDays)
{
month += ;
if (second + totalSeconds > timestamp)
break; totalSeconds += second;
}
remainSeconds = timestamp - totalSeconds;
return month;
} /// <summary>
/// 计算年
/// </summary>
/// <param name="timestamp"></param>
/// <param name="remainSeconds"></param>
/// <returns></returns>
private static int GetYear(int timestamp, out int remainSeconds)
{
int year = , totalSeconds = ; while (true)
{
year += ;
int second = GetYearSeconds(year);
//年份总秒数大于时间戳
if (totalSeconds + second > timestamp)
break; totalSeconds += second; } remainSeconds = timestamp - totalSeconds; return year;
} /// <summary>
/// 得到每一年的总秒数
/// </summary>
/// <param name="year"></param>
/// <returns></returns>
private static int GetYearSeconds(int year)
{
if (IsLeepYear(year))
return * * * ;
else
return * * * ;
} /// <summary>
/// 判断闰年
/// </summary>
/// <param name="year"></param>
/// <returns></returns>
private static bool IsLeepYear(int year)
{ if (year % == && year % != )
return true;
else if (year % == )
return true;
else
return false;
}
/**
* Created by chong on 2017/7/4.
*/
public class DateHelper {
/**
* unix时间戳转时间
*
* @param timestamp 时间戳
* @return
* @throws ParseException
*/
public static Date uixTimestmpToDate(int timestamp) throws ParseException {
int[] year = GetYear(timestamp);
int[] month = GetMonth(year[1], year[0]);
int[] day = GetDay(month[1]);
int[] hour = GetHours(day[1]);
int[] minute = GetMinute(hour[1]); String strDate = String.format("%d-%d-%d %d:%d:%d", year[0], month[0], day[0], hour[0], minute[0], minute[1]); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//这次没有处理时区,所以直接输出的是UTC时间
Date strtodate = formatter.parse(strDate); return strtodate;
} /**
* 计算分钟
*
* @param timestamp
* @return
*/
private static int[] GetMinute(int timestamp) {
int minute = timestamp / 60; int remainSeconds = timestamp - minute * 60; return new int[]{minute, remainSeconds};
} /**
* 计算小时
*
* @param timestamp
* @return
*/
private static int[] GetHours(int timestamp) {
int hour = timestamp / (60 * 60); int remainSeconds = timestamp - hour * 60 * 60; return new int[]{hour, remainSeconds};
} /**
* 计算日
*
* @param timestamp
* @return
*/
private static int[] GetDay(int timestamp) {
int daySeconds = 24 * 60 * 60; int day = timestamp / daySeconds; int remainSeconds = timestamp - day * daySeconds; return new int[]{day + 1, remainSeconds};
} /**
* 计算月
*
* @param timestamp
* @param year
* @return
*/
private static int[] GetMonth(int timestamp, int year) {
// 每天的秒数
int daySeconds = 24 * 60 * 60;
//每月的总秒数
int[] monthDays = new int[]{31 * daySeconds, 28 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds}; if (IsLeepYear(year))
monthDays[1] = 29 * daySeconds; int totalSeconds = 0, month = 0;
for (int second : monthDays) {
month += 1;
if (second + totalSeconds > timestamp)
break; totalSeconds += second;
}
int remainSeconds = timestamp - totalSeconds;
return new int[]{month, remainSeconds};
} /**
* 计算年
*
* @param timestamp
* @return
*/
private static int[] GetYear(int timestamp) {
int year = 1969, totalSeconds = 0; while (true) {
year += 1;
int second = GetYearSeconds(year);
//年份总秒数大于时间戳
if (totalSeconds + second > timestamp)
break; totalSeconds += second; }
int remainSeconds = timestamp - totalSeconds; return new int[]{year, remainSeconds};
} /**
* 得到每一年的总秒数
*
* @param year
* @return
*/
private static int GetYearSeconds(int year) {
if (IsLeepYear(year))
return 366 * 24 * 60 * 60;
else
return 365 * 24 * 60 * 60;
} /**
* 判断闰年
*
* @param year
* @return
*/
private static boolean IsLeepYear(int year) { if (year % 4 == 0 && year % 100 != 0)
return true;
else if (year % 400 == 0)
return true;
else
return false;
} }

Unix时间戳转日期时间格式,C#、Java、Python各语言实现!的更多相关文章

  1. python转换时间戳和日期时间格式的转换

    [steven@txzxp2 seccenter]$ python Python 2.7.5 (default, Jul  8 2013, 09:48:59)  [GCC 4.8.1 20130603 ...

  2. python 日期、时间处理,各种日期时间格式/字符串之间的相互转换究竟是怎样的?

    模块函数说明 ''' date 日期对象,常用的属性有year,month,day time 时间对象,常用的属性有hour,minute,second,毫秒 datetime 日期时间对象,常用的属 ...

  3. c# DateTime时间格式和JAVA时间戳格式相互转换

    /// java时间戳格式时间戳转为C#格式时间 public static DateTime GetTime(long timeStamp) { DateTime dtStart = TimeZon ...

  4. [php基础]Mysql日期函数:日期时间格式转换函数详解

    在PHP网站开发中,Mysql数据库设计中日期时间字段必不可少,由于Mysql日期函数输出的日期格式与PHP日期函数之间的日期格式兼容性不够,这就需要根据网站实际情况使用Mysql或PHP日期转换函数 ...

  5. UNIX时间戳与日期的相互转换

    mysql中UNIX时间戳与日期的相互转换 UNIX时间戳转换为日期用函数:FROM_UNIXTIME() select FROM_UNIXTIME(1410318106); 日期转换为UNIX时间戳 ...

  6. db2 日期时间格式

    db2日期和时间常用汇总 1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2 ...

  7. Android日期时间格式国际化

    公共类 的DateFormatSymbols 扩展对象 实现 Serializable接口 Cloneable接口 java.lang.Object的    ↳ java.text.DateForma ...

  8. Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式

    Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式 找到eclipse安装文件夹以下的plugins文件夹,搜索 org.eclipse.text ,找到一个jar ...

  9. js中时间戳与日期时间之间的相互转换

    1.时间戳转换为标准日期时间格式: function timeFormat(dateStr) { var date = new Date(dateStr); Y = date.getFullYear( ...

随机推荐

  1. java中Class.getMethod方法

    Method Class.getMethod(String name, Class<?>... parameterTypes)的作用是获得对象所声明的公开方法 该方法的第一个参数name是 ...

  2. [leetcode]2. Add Two Numbers.cpp

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  3. BBS(第一天)项目之 注册功能实现通过forms验证与 前端ajax请求触发查询数据库判断用户是否存在的功能实现

    1.BBS项目之注册功能通过forms验证 from django import forms from blog.models import User from django.contrib.auth ...

  4. windows from docker 安装部署spring jar包方法

    1.安装docker for windows,去官网下载就可以了,按照官网安装 2.把jar和dockerfile放在一个目录下(target 目录下) Dockerfile: FROM java:8 ...

  5. html2canvas

    最近公司有个需求,实现html 页面元素转为png图像,这边用了html2canvas来实现.,这里记录一下,避免以后忘了~~ 官网链接: http://html2canvas.hertzen.com ...

  6. cdnbest架设cdn同一个源用不同的端口访问如何设置

    在站点里的应用防火墙-->高级设置里配置 比如test.com要同时用80和88访问

  7. window.innerWidth和document.body.clientWidth的区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Java学习笔记(二十三):final关键字

    final关键字有三种使用场景: final修饰类 final修饰方法 final修饰变量 final修饰的类,不能再有子类继承. 只要满足以下条件就可以把一个类设计为final类: 不是专门为继承而 ...

  9. 整合Spring框架和MyBatis框架

    ------------------------siwuxie095                                 整合 Spring 框架和 MyBatis 框架         ...

  10. SpriteKit 关于categoryBitMask collisionBitMask contactTestBitMask 遇到的一些问题

    手写copy一下官方解释 首先是categoryBitMask /** 定义了这个物理刚体是属于哪个类别的掩码 .在一个场景中的每个物理刚体可以分配给达到 32 不同的类别(参数 int bitmas ...