时制转换时的电话账单

最近做过这样一个题目:

对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春季,这种转换发生在(3 月末,4 月初的)星期日凌晨 2:00 时,这时时钟要设置为凌晨 3: 00 时。对称的转换通常发生在 10 月最后一个星期日,时钟要从 2:59:59 调回到 2:00:00。

请为采用以下费率计算用户的每月通话费:

1)通话时间<=20 分钟时,每分钟收费 0.05 美元,通话时间不到 1 分钟时按 1 分钟计算。

2)通话时间>20 分钟时,收费 1.00 美元,外加每分钟 0.10 美元,超过 20 分钟的部分,不到 1 分钟时按 1 分钟计算。假设:

(1)通话计费时间从被叫方应答开始计算,到呼叫方挂机时结束。

(2)通话时间的秒数四舍五入到分钟。

(3)没有超过 20 个小时的通话。

 

这道题中,通话在发生时制转换的那一天的情况是比较复杂的,下面是本人自己写的程序:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class HoldingTime {
	private String startingTime;
	private String endingTime;
	private long minute;//通话时长
	public Date startT;
	public Date endT;
	public  HoldingTime(String startingTime,String endingTime){
		this.startingTime = startingTime;
		this.endingTime = endingTime;
		this.startT = StrToDate(this.startingTime);
		this.endT = StrToDate(this.endingTime);
	}
	
	public Date StrToDate(String str) {
		   SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		   Date date = null;
		   try {
		    date = format.parse(str);
		   } catch (ParseException e) {
		    e.printStackTrace();
		   }
		   return date;
		}
	public String DateFormate(Date date){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
		String sdate = format.format(date);
		return sdate;
	}
	public long getHoldingTime(){
		long between;
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(startT);
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(endT);
		
		between = cal2.getTime().getTime()-cal1.getTime().getTime();
		if(between<0)
			minute =( (cal2.getTime().getTime()-cal1.getTime().getTime())/1000)/60;//得到通话时长
		else
			minute = (between/1000+59)/60;
		//判断接通时间是否在发生转换的日期
		if((cal1.get(Calendar.MONTH) ==Calendar.MARCH && cal1.get(Calendar.DATE) >= 29 && cal1.get(Calendar.DATE) <= 31 && cal1.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)
			|| ((cal1.get(Calendar.MONTH) ==Calendar.APRIL && cal1.get(Calendar.DATE) >= 1 && cal1.get(Calendar.DATE) <= 4 && cal1.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)))
		{
			System.out.println("需要转换1");
			if(cal1.get(Calendar.HOUR_OF_DAY)<2 && cal2.get(Calendar.HOUR_OF_DAY)>=3)
				minute -=60;//时间从2点转换到3点减去1h
		}else{
			if((cal2.get(Calendar.MONTH) ==3 && cal2.get(Calendar.DATE) >= 29 && cal2.get(Calendar.DATE) <= 31 && cal2.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)
					|| ((cal2.get(Calendar.MONTH) ==4 && cal2.get(Calendar.DATE) >= 1 && cal2.get(Calendar.DATE) <= 4 && cal2.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)))
				//判断结束时间是否在转换的日期
			{
				if(cal2.get(Calendar.HOUR_OF_DAY)>3 )
					minute -=60;
			}
		}
		//将位于转换的时间段内的时间都看作已经转换之后的
		if(cal1.get(Calendar.MONTH) ==Calendar.OCTOBER && cal1.get(Calendar.DATE) >= 25 && cal1.get(Calendar.DATE) <= 31 && cal1.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)
		{
			if(cal1.get(Calendar.HOUR_OF_DAY) ==2){
						minute +=60;
			}
		}else{
			if(cal2.get(Calendar.MONTH) ==Calendar.OCTOBER && cal2.get(Calendar.DATE) >= 25 && cal2.get(Calendar.DATE) <= 31 && cal2.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)
			{
				if(cal2.get(Calendar.HOUR_OF_DAY)==2)
				{
						minute +=60;
				}
			}
		}
		if(minute>1200 || minute <0){
			System.out.println("时间错误,时限范围不对!");
			return 0;
		}else{
			//System.out.println("间隔正确");
			return minute;
		}
	}
}
这段代码是判断时间并且返回通话时长的

-

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
public class TelFee {
	public static void main(String[] args) {
		
		double telFee;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//字符输入流
		 try {
			System.out.println("请输入起始时间(如20170102030405):");
			String sd1=br.readLine();//按行读入
			System.out.println("请输入截止时间(如20170102030405):");
			String sd2=br.readLine();
			
			HoldingTime ht = new HoldingTime(sd1,sd2);
			
			System.out.println("电话接通时间:"+ht.DateFormate(ht.startT));
			System.out.println("电话结束时间:"+ht.DateFormate(ht.endT));
			
			DecimalFormat    df   = new DecimalFormat("######0.00"); 
			 long minute = ht.getHoldingTime();
			//计算话费
			if(minute <= 20){
				telFee = 0.05*minute;
			}else{
				telFee = 1.00 + (minute - 20)*0.1;
			}
			System.out.println("通话时间为:"+minute+"分钟");
			System.out.println("本次通话话费为:"+df.format(telFee)+"美元");
		}catch (IOException e) {
			   e.printStackTrace();
			 }
	}
}
这段则是相应的输入输出代码。


做这道题的时候调用了Calendar类的一些方法,相较于Date类来说,个人觉得Calendar类使用起来更加的方便。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值